如何在Java 8 Streaming API中保留集合中未过滤的数据?

bra*_*orm 3 java-8 java-stream

我的输入序列是: [1,2,3,4,5]

结果应该是: [1,12,3,14,5]

即偶数增加10,但奇数值保持不变.

这是我尝试过的:

public static List<Integer> incrementEvenNumbers(List<Integer> arrays){
        List<Integer> temp = 
          arrays.stream()
                .filter(x->x%2==0)
                .map(i -> i+10)
                .collect(Collectors.toList());
        return temp;
    }
Run Code Online (Sandbox Code Playgroud)

当我称这种方法时,

System.out.println(incrementEvenNumbers(Arrays.asList(1,2,3,4,5)));
Run Code Online (Sandbox Code Playgroud)

我得到[12, 14].我想知道如何包含不filtered渗透的值,但map不应该应用它.

Ale*_* C. 6

您可以使用三元运算符map,以便您应用的函数是奇数值的标识,或者对于偶数值将值递增10的函数:

 List<Integer> temp = arrays.stream()
                            .map(i -> i % 2 == 0 ? i+10 : i)
                            .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,问题是过滤器将删除元素,因此当调用终端操作时,它们将被谓词过滤.

请注意,如果您不在乎修改列表,可以replaceAll直接使用,因为您正在进行从类型T到T的映射.

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
list.replaceAll(i -> i % 2 == 0 ? i+10 : i); //[1, 12, 3, 14, 5]
Run Code Online (Sandbox Code Playgroud)

  • `map()`将`Function`作为参数但是是.如果逻辑很复杂,您可能会使用方法引用. (2认同)