根据流中的条件应用不同功能的正确方法[已关闭]

问题描述 投票:0回答:1

使用流实现此功能逻辑的正确方法是什么?

  1. 流式传输项目列表

  2. 检查条件 1 是否通过,如果通过,则将函数 1 应用于该项目。

    检查条件 2 是否通过,如果通过,则将函数 2 应用于该项目。

    如果两个条件均未满足,则不执行任何操作。

  3. 收集结果

我是否与供应商创建谓词,或者这看起来如何?我对函数式 Java 不太熟悉。

java java-8 java-stream functional-interface supplier
1个回答
0
投票

您可能最好使用一个简单的 for 循环,但您可以这样做:

List<Item> list;
list.stream()
    .forEach(item -> {
       boolean condition1 = predicate1.test(item);
       boolean condition2 = predicate2.test(item);
       if(condition1 && !condition2) {
            applyFunction1(item);
       } else if(!condition1 && condition2) {
            applyfunction2(item);
       }
   });

这直接对底层列表进行操作。如果您想收集到不同的集合,请使用

map
(但显然这取决于修改函数的实现,无论它包含克隆还是原始的,现在也已修改的对象):

List<Item> list;
List<Item> modifiedList = list.stream()
   .map(item -> {
       if(condition1 && !condition2) {
            return function1.apply(item);
       } else if(!condition1 && condition2) {
            return function2.apply(item);
       }
       return item;
   })
   .toList();

如果您不关心项目的最终排序,这里有另一种方法,您会发现这种方法很愚蠢......:

    List<Item> list;
    Predicate<Item> predicate1;
    Predicate<Item> predicate2;
    Function<Item, Item> function1;
    Function<Item, Item> function2;

    Stream<Item> modifiedBy1 = list.stream()
        .filter(predicate1.and(predicate2.negate()))
        .map(function1);
    Stream<Item> modifiedBy2 = list.stream()
        .filter(predicate1.negate().and(predicate2))
        .map(function1);
    Stream<Item> unmodified = list.stream()
        .filter(predicate1.negate().and(predicate2.negate()));
    
    Stream<Item> recombined = Stream
        .of(modifiedBy1, modifiedBy2, unmodified) //a Stream of Streams
        //you can influence the order of elements by swapping these around
        //the result is essentially sorted by which conditions where matched
        .flatMap(Function.identity()); //flatten the streams back to their constituent objects
    //could also have used 2x Stream.concat here
© www.soinside.com 2019 - 2024. All rights reserved.