作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图了解 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 无效。
当您使用map 时,您希望传递一个Function。或 UnaryOperator ,接收单个对象并返回单个对象。因此返回小写的新字符串。
在这两种情况下,对象都不会被克隆。因此,您可以在 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/
我是一名优秀的程序员,十分优秀!