繁体   English   中英

Java Stream 用法

[英]Java Stream usage

我有一个用例,我想根据某些条件修改列表中的一些条目,并保留 rest 原样。 为此,我正在考虑使用 java 流,但我找不到可行的解决方案。 我知道使用filtermap将不起作用,因为它会过滤掉不满足条件的元素。 有什么我可以使用的吗?

例子 -

List<Integer> a = new ArrayList<>();
a.add(1); a.add(2);

// I want to get square of element if element is even 
// Current solution 
List<Integer> b = a.stream().filter(i -> i % 2 == 0).map(i -> i * i).collect(Collectors.toList());

// This outputs - b = [4]
// But I want - b = [1, 4]

您可以使 map 操作有条件并删除过滤器:

List<Integer> b = a.stream()
            .map(i -> i % 2 == 0 ? i * i : i)
            .collect(Collectors.toList());

如果您只想修改一些条目,则您实际上并不需要流并创建一个新列表。 相反,您可以使用List#replaceAll

a.replaceAll(i -> i % 2 == 0 ? i * i : i);

您可以像这样将条件放入 map 中:

List<Integer> a = new ArrayList<>();
a.add(1);
a.add(2);
List<Integer> b = a.stream().map(i -> i % 2 == 0 ? i * i : i).collect(Collectors.toList());

不幸的是List<FooData>可能会改变FooData字段,但List<Integer>有点难;

List<FooData> list = ...;
list.stream()
    .filter(fd -> fd.deservesMore())
    .filter(fd::deservesMore)
    .forEach(fd -> fd.setSalary(fd.getSalary()**2);

对于List<Integer>我犹豫不决,我看到一个答案是map有条件更改。 integer 是更复杂的 object 的一部分,或者它可以保存在一个数组中,其中索引有一些意义。

int[] a = {1, 2};
IntStream.ofRange(0, a.length)
    .filter(i -> i % 2 == 0)
    .forEach(i -> a[i] *= a[i]);

这不过是一个 _for-i_loop。

我想你想要这样的东西:

List<AtomicInteger> a = new ArrayList<>();
Collection.addAll(a,
    new AtomicInteger(1),
    new AtomicInteger(2));
a.stream()
    .filter(i -> i.get() % 2 == 0)
    .forEach(i -> i.set(i.get() * i.get()));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM