减少Java流中的If

时间:2018-10-03 09:32:57

标签: java java-8 java-stream reduce

仅当谓词为真时,如何才能应用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=..."

4 个答案:

答案 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();