gpt4 book ai didi

java - peek 和 map 如何在流中工作

转载 作者:行者123 更新时间:2023-12-05 01:19:43 28 4
gpt4 key购买 nike

我试图了解 Java 8 流中的 peek 和 map 有何不同。我尝试了以下方法

public static void main(String[] args) {
List<String> arr = new ArrayList<String>();
arr.add("A");
arr.add("B");

List<String> a = arr.stream().peek(t->t.toLowerCase()).collect(Collectors.toList());
System.out.println(a);
}

上面的代码没有将字母改为小写。但是当我尝试以下操作时

  public static void main(String[] args) {
List<String> arr = new ArrayList<String>();
arr.add("A");
arr.add("B");

List<String> a = arr.stream().map(t->t.toLowerCase()).collect(Collectors.toList());
System.out.println(a);
}

字母被转换为小写。我怀疑我是否像下面那样同时使用 map 和 peek

 public static void main(String[] args) {
List<String> arr = new ArrayList<String>();
arr.add("A");
arr.add("B");

List<String> a = arr.stream().map(t->t.toLowerCase()).peek(t->toUpper()).collect(Collectors.toList());
System.out.println(a);
}

public static Function<String, String> toUpper(){
return t->{
return t.toUpperCase();
};
}

map 方法将 A、B 转换为 lower 而 Peek 什么都不做。所以如果在流式传输时涉及任何计算我不能使用 peek 吗?有人可以解释一下

修改后的代码

static  List<Employee> e = new  ArrayList<>();
public static void main(String[] args) {
List<String> arr = new ArrayList<String>();
arr.add("Pavan");
arr.add("Kumar");


System.out.println("Size of emp"+e.size());
List<String> a = arr.stream().map(t->t.toLowerCase()).peek(t->populateEmp()).collect(Collectors.toList());
System.out.println("Size of emp"+e.size());
System.out.println(a);
}

public static Function<String, Employee> populateEmp(){
Employee ee = new Employee();
return t->{
System.out.println(t);
ee.setName(t);
e.add(ee);
return ee;
};
}

这仍然没有将 Emp 添加到列表中

最佳答案

Peek 期望 Consumer ,因此如果您使用 toLowerCase(),您将创建一个新的字符串,并将其放入 void 中。您可以在消费者内部修改此对象,但 String 是不可变的,因此 peek 无效。

当您使用ma​​p 时,您希望传递一个Function。或 UnaryOperator ,接收单个对象并返回单个对象。因此返回小写的新字符串。

在这两种情况下,对象都不会被克隆。因此,您可以在 peek 函数内修改一个可变对象,但这样做是错误的方法:) 尝试传递一个日期,然后您可以在 peek 函数内设置小时数,因为它是可变的。

简而言之:

  • 使用映射将模型转换为另一个模型
  • 使用 peek,做一些消耗此对象的事情,但不修改它(发送通知、打印模型等)

更新:

public static Function<String, Employee> populateEmp(){
Employee ee = new Employee();
System.out.print("I am executed");
return t->{
System.out.print("I am not");
return null;
};
}

试试这个代码。在您的更新中,您传递了一个消费者,它忽略了传递的参数,并且您执行 populateEmp() 方法,该方法返回一个函数,该函数添加到映射转换的对象。但是你永远执行这个函数,tus->列表是空的:)

在非 lambda 词中它看起来像这样:

for(String value: arr){
populateEmp(); // execute method but you do nothing with this Function.
}

所以用这个替换你的 peek:

.peek(t->populateEmp().apply(t))

关于java - peek 和 map 如何在流中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38344982/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com