根据流中的条件应用不同功能的正确方法
Correct way to apply different fucntions based on condition in stream
使用流实现此功能逻辑的正确方法是什么?
流式浏览项目列表
检查条件 1 是否通过,如果通过则将功能 1 应用到项目。
检查条件 2 是否通过,如果通过则将功能 2 应用到项目。
如果两个条件都不通过,什么都不做。
收集结果
我是否与供应商一起创建谓词或者这看起来如何?我对函数 Java.
不是很熟悉
你可能最好使用一个简单的 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();
如果您不关心项目的最终排序,这里有另一种方法,您会发现它很愚蠢...:[=14=]
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
使用流实现此功能逻辑的正确方法是什么?
流式浏览项目列表
检查条件 1 是否通过,如果通过则将功能 1 应用到项目。
检查条件 2 是否通过,如果通过则将功能 2 应用到项目。
如果两个条件都不通过,什么都不做。
收集结果
我是否与供应商一起创建谓词或者这看起来如何?我对函数 Java.
不是很熟悉你可能最好使用一个简单的 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();
如果您不关心项目的最终排序,这里有另一种方法,您会发现它很愚蠢...:[=14=]
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