在Java Stream中减少If

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Java Stream中减少If相关的知识,希望对你有一定的参考价值。

如果谓词为真,我该如何应用reduce操作?

例如:

        Stream.of("foo=X","bar=Y","foo=Z")
        .reduce((arg1, arg2)-> arg1.contains(arg2) ? arg1  : <reduceNothing>)
        .collect(Collectors.toList());

我想摆脱一个"foo=..."最后有一个"foo=X","bar=Y"列表

答案

这是一种方法(没有流):

Map<String, String> map = new LinkedHashMap<>();

yourListOfArgs.forEach(arg -> map.merge(arg.split("=")[0], arg, (o, n) -> o));

Collection<String> uniqueArgs = map.values();
另一答案

只需使用可以获得第一个(在遭遇顺序中)结果的合并,以防发现重复:

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]
另一答案

试试这个:

Stream.of("foo=X","bar=Y","foo=Z")
            .collect(Collectors.toMap(
                    x -> getLeftSide(x),
                    x -> x,
                    (x, y) -> x
            ))
            .values();

我假设您有getLeftSide方法返回赋值的左侧部分(将"foo=bar"转换为"foo")。

另一答案

如果有灵活性可以使用除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

以上是关于在Java Stream中减少If的主要内容,如果未能解决你的问题,请参考以下文章

Java Stream按条件减少多个列表

使用 Java 8 Stream API 减少 Map

Java Stream 减少泛型类型的 ArrayList

通过 Stream API 迭代和减少 Java 映射的值

Java8 Stream流

Java Stream 减少无法解释的行为