流过滤后访问所有元素

时间:2018-01-13 17:52:46

标签: java java-8 java-stream

我的任务是过滤一个数组,更改剩余的元素并返回包含已更改和未更改值的数组。我的代码:

return Arrays.stream(sentence.split(" "))
    .filter(/* do some filter to each value */)
    .map(/* map this value*/)
    .collect(Collectors.joining());

如何返回已更改的未更改值的数组?

3 个答案:

答案 0 :(得分:8)

filter删除元素。如果您不想删除元素,而只是更改其中的一些元素,则可以使用?:map内的if-else来有选择地更改元素。

例如:

System.out.println(Stream.of("abc", "def", "ghi")
    .map(a -> a.equals("def") ? "xyz" : a)
    .collect(Collectors.toList()));

或者:

System.out.println(Stream.of("abc", "def", "ghi")
    .map(a -> {
       if (a.equals("def"))
          return "xyz";
       else
          return a;
    })
    .collect(Collectors.toList()));

这只会将等于def的元素更改为xyz(对于每个其他元素,它只会将该元素保持原样),输出将为:

[abc, xyz, ghi]

答案 1 :(得分:3)

我们也可以在没有流的情况下实现这一点。

List<String> list = Arrays.asList("abc", "def", "ghi");
list.replaceAll(s -> s.equals("def") ? "xyz" : s);
System.out.println(list);

<强>输出

[abc, xyz, ghi]

答案 2 :(得分:2)

最简单的选择是使用map中间操作以及Dukeling提到的三元运算符,但另一种变体是:

 String result = 
          Pattern.compile(" ")
                 .splitAsStream(sentence)
                 .map(s -> criteria ? modification : s) // partly pseudocode
                 .collect(Collectors.joining(" "));