Java peek和map如何在流中工作

Java peek和map如何在流中工作,java,java-stream,Java,Java Stream,我试图了解Java8流中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()).col

我试图了解Java8流中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);
    }
publicstaticvoidmain(字符串[]args){
List arr=new ArrayList();
协议补充(“A”);
协议添加(“B”);
列表a=arr.stream().peek(t->t.toLowerCase()).collect(collector.toList());
系统输出打印项次(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);
    }
publicstaticvoidmain(字符串[]args){
List arr=new ArrayList();
协议补充(“A”);
协议添加(“B”);
列表a=arr.stream().map(t->t.toLowerCase()).collect(collector.toList());
系统输出打印项次(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();
        };
    }
publicstaticvoidmain(字符串[]args){
List arr=new ArrayList();
协议补充(“A”);
协议添加(“B”);
列表a=arr.stream().map(t->t.toLowerCase()).peek(t->toUpper()).collect(Collectors.toList());
系统输出打印项次(a);
}
公共静态函数toUpper(){
返回t->{
返回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;
    };
}
static List e=new ArrayList();
公共静态void main(字符串[]args){
List arr=new ArrayList();
arr.add(“Pavan”);
arr.add(“Kumar”);
System.out.println(“emp的大小”+e.Size());
列表a=arr.stream().map(t->t.toLowerCase()).peek(t->populateEmp()).collect(Collectors.toList());
System.out.println(“emp的大小”+e.Size());
系统输出打印项次(a);
}
公共静态函数populateEmp(){
员工ee=新员工();
返回t->{
系统输出打印ln(t);
ee.集合名(t);
e、 添加(ee);
返回ee;
};
}
这仍然没有将Emp添加到列表中

Peek需要一个,因此如果您使用toLowerCase(),您将创建一个新字符串,该字符串将作废。您可以在使用者内部修改此对象,但字符串是不可变的,所以peek无效

当您使用映射时,您希望传递一个or,它接收单个对象并返回单个对象。因此,返回小写的新字符串

在这两种情况下,都不会克隆对象。因此,您可以修改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;
        };
    }
因此,用以下内容替换您的窥视:

.peek(t->populateEmp().apply(t))
Peek需要一个,因此如果您使用toLowerCase(),您将创建一个新字符串,该字符串将作废。您可以在使用者内部修改此对象,但字符串是不可变的,所以peek无效

当您使用映射时,您希望传递一个or,它接收单个对象并返回单个对象。因此,返回小写的新字符串

在这两种情况下,都不会克隆对象。因此,您可以修改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;
        };
    }
因此,用以下内容替换您的窥视:

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

如果我将这些字符串添加到peek中的列表中会怎么样。这会将这些字符串添加到列表中吗?当您在列表中使用流时,peek和map将应用于每个列表元素。所以,如果你有一系列的列表,那么你可以在每个列表中添加一些peek中的内容。与将列表传递给方法相同,并在那里修改它。但是,正如我所说的,这是一种糟糕的做法。如果我在peek中将这些字符串添加到一个列表中会怎么样呢..这会将这些字符串添加到列表中吗?当您在列表中使用流时,peek和map将应用于每个列表元素。所以,如果你有一系列的列表,那么你可以在每个列表中添加一些peek中的内容。与将列表传递给方法相同,并在那里修改它。但正如我所说,这是一种糟糕的做法。