Java 8:使用Lambda表达式通过流修改特定元素

4
我需要修改一个 int 类型的列表,具体如下:
  • 每个元素等于 10 的都需要翻倍
这是我的尝试:
list.stream()
            .filter(val -> val.getValue() == 10)
            .map(val -> {
                val.doubleValue();
                return val;
            })
            .forEach(System.out::println);

问题在于我正在过滤元素,而我想保留它们所有并只修改等于0的元素。
编辑:该列表由以下定义的MyType元素组成:
public class MyType {

    private int val;

    public MyType(int v){
        this.val = v;
    }

    public void doubleVal(){
        val*val;
    }

    public int getValue(){
        return val;
    }
}

有任何建议吗?(涉及IT技术)

将条件移到map函数中,只有在满足条件时才进行递增?在所有其他情况下返回未修改的值。 - Henrik Aasted Sørensen
3
你正在对val进行平方,而不是将其加倍。 - DaveH
1
val.doubleValue() 不会将 val 的值加倍,它返回 val 作为 double 类型的值(即 10 变成 10.0)。 - Eran
doubleValue视为由我定义的函数,其定义为value*value。如果名称具有误导性,请将其视为doubleMyVal - Andi Pavllo
1
@Pavz7 那么,你的List元素的类型是什么?你在评论中说它是int,但根据你的代码,它不可能是int。 - Eran
@Eran 对不起让你产生了误解。我试图保持简单,然后将其迁移到实际类型的列表中。我已更新问题。 - Andi Pavllo
3个回答

10

不要使用filter,把所有逻辑放在map中:

list.stream()
    .map(val -> val == 10 ? 2*val : val)
    .forEach(System.out::println);

编辑:在你澄清列表元素为Integer后,我简化了代码。请注意,原始List保持不变。


val 是一个 int - Andi Pavllo
1
@Pavz7 然后 val.inc() 无法通过编译。 - Eran
你说得对,那是一个打字错误。我刚刚纠正了它。尝试运行您的例子“fixed”,但我没有得到返回值。我得到的是类似于 int@568db2f2 的东西。 - Andi Pavllo
我成功让它运行了,但似乎它同时修改了值,而我只想要打印它们。你有什么想法为什么会这样? - Andi Pavllo

2
假设您的列表是一个 Val 列表,而 Val 类似于:
class Val {
  private int v;

  public Val(int v) {
    this.v = v;
  }
  int getValue() {
    return v;
  }

  public void doubleValue() {
    v *= 2;
  }
}

那么。
  public static void main(String ... args ) {
        List<Val> ints = Arrays.asList(new Val(1), new Val(5), new Val(10), new Val(2));
        ints.stream().map((v) -> {
            if (v.getValue() == 10) v.doubleValue(); return v;
        }).forEach(v -> System.out.println(v.getValue()));

    }

会做到位。

好的,这是基于问题信息较少时的回答 ;) - Redlab

1
在地图中评估条件,而不是筛选。
List<Integer> list = new ArrayList<>();

    list.add(10);
    list.add(5);
    list.add(4);

    list.stream().map(val -> {
        if(val < 10){
            return val * val;
        }
        return val;
    }).forEach(System.out::println);

这句话的意思是“这将输出为10、25和16;”。保留了HTML,不进行解释。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接