仅当谓词为真时,如何才能应用reduce操作?
例如:
if str("S"+dict_1[d1]["Start"]+"E"+dict_1[d1]["End"]) in dict_2:
# add to dict_3
我想摆脱 Stream.of("foo=X","bar=Y","foo=Z")
.reduce((arg1, arg2)-> arg1.contains(arg2) ? arg1 : <reduceNothing>)
.collect(Collectors.toList());
的其中一个,以在列表末尾有"foo=..."
答案 0 :(得分:3)
如果发现重复项,只需使用将获得第一个(按遇到顺序)结果的合并:
Collection<String> result = Stream.of("foo=X", "bar=Y", "foo=Z", "bar=M", "test=12")
.collect(Collectors.toMap(
x -> x.split("=")[0],
Function.identity(),
(left, right) -> left,
LinkedHashMap::new))
.values();
System.out.println(result); // [foo=X, bar=Y, test=12]
如果您需要保留初始订单,我会使用LinkedHashMap
,如果不需要,只需使用:
Collection<String> result = Stream.of("foo=X", "bar=Y", "foo=Z", "bar=M", "test=12")
.collect(Collectors.toMap(
x -> x.split("=")[0],
Function.identity(),
(left, right) -> left))
.values();
System.out.println(result); // [bar=Y, test=12, foo=X]
答案 1 :(得分:2)
尝试一下:
Stream.of("foo=X","bar=Y","foo=Z")
.collect(Collectors.toMap(
x -> getLeftSide(x),
x -> x,
(x, y) -> x
))
.values();
我假设您有getLeftSide
方法可返回分配的左部分(将"foo=bar"
转换为"foo"
)。
答案 2 :(得分:1)
如果可以灵活使用除reduce以外的任何其他操作,则可以回答以下问题:
@Test
public void test(){
System.out.println(methodContainingFilteringLogic(word -> word.equals("foo=Z"),
Stream.of("foo=X","bar=Y","foo=Z")));
}
public static List<String> methodContainingFilteringLogic(Predicate<String> predicate, Stream<String> wordsStream) {
return wordsStream.filter(word -> predicate.negate().test(word))
.collect(Collectors.toList());
}
在您的情况下,应在给定流应基于哪个点进行过滤的点上知道。此时可以调用methodContainingFilteringLogic
。
答案 3 :(得分:1)
这是一种方法(没有流):
Map<String, String> map = new LinkedHashMap<>();
yourListOfArgs.forEach(arg -> map.merge(arg.split("=")[0], arg, (o, n) -> o));
Collection<String> uniqueArgs = map.values();