使用Java8将列表转换为集合

使用Java8将列表转换为集合,java,collections,Java,Collections,最近,我遇到了Java 8的新语法,可用于将列表转换为集合: Set<Integer> myset = mylist.stream().collect(Collectors.toSet())); Set myset=mylist.stream().collect(Collectors.toSet()); 我想知道使用这种方法将列表转换为集合比传统方法(通过将其作为参数传递给HashSet)的优点。优点是,这样可以更容易(或者更准确地说,需要更少的语法更改)同时执行其他功能操作 稍

最近,我遇到了Java 8的新语法,可用于将列表转换为集合:

Set<Integer> myset = mylist.stream().collect(Collectors.toSet()));
Set myset=mylist.stream().collect(Collectors.toSet());

我想知道使用这种方法将列表转换为集合比传统方法(通过将其作为参数传递给HashSet)的优点。

优点是,这样可以更容易(或者更准确地说,需要更少的语法更改)同时执行其他功能操作

稍后,如果您只需要集合中的偶数,则可以通过过滤器轻松实现:

Set<Integer> myset = mylist.stream()
        .filter(p -> p%2==0)
        .collect(Collectors.toSet());
Set myset=mylist.stream()
.filter(p->p%2==0)
.collect(收集器.toSet());
如果您使用传统的方法,那么您要么需要将其转换为上述语法,要么编写一个额外的循环来遍历并仅提取所需的值

(这并不意味着它总是更好的——在某些情况下,您可能不希望有人在以后更改代码以过滤掉值,在这种情况下,您可能会认为传统的方法仍然更可取。)

请在下面找到使用java 8的**stream API设置的代码列表**
包流API;
导入java.util.*;
导入java.util.stream.Collector;
导入java.util.stream.collector;
班主任{
int empid;
字符串名;
Person(int-empid,字符串名){
this.empid=empid;
this.name=名称;
}
公共字符串toString(){
返回“id”+this.empid+“name”+this.name;
}
公共布尔等于(对象obj){
人员p=(人员)obj;
如果(p.empid==this.empid&&p.name.equals(this.name)){
返回true;
}
返回false;
}
公共int hashCode(){
返回this.empid+this.name.hashCode();
}
}
公共类集合筛选器{
公共静态void main(字符串[]args){
列表=新的ArrayList();
增加(新人员(101,“aaa”);
新增(新增人员200人,简称bbbb);
增加(新人员(150,“ccccc”);
新增(新增人员250人,下称DDD);
新增(新增人员250人,下称DDD);
converListToSet(列表);
}
公共静态无效对流列表集(列表){
Set=list.stream()
.collect(收集器.toSet());
set.forEach(person->System.out.println(person));
}
}
输出如下:
id200namebbbb
id101nameaaa
ID150nameCCCC
ID250NameDDD

我希望,您能理解:)

如果这就是您的全部工作,那么与新的HashSet(mylist)相比没有任何优势。如果你想过滤或映射你的流,那么它有一个优点。请用老式的方法。JDK的制造商已经优化了
HashSet
的构造函数,使其能够高效工作。使用
stream()
-没有那么多。@DawoodibnKareem因为
HashSet
s构造函数在插入元素之前将内部映射初始化为合理大小?@Michael,部分原因是,在创建流时存在实实在在的、可测量的开销。此外,我们可以信任Oracle,以确保HashSet构造函数中发生的事情是“最好的”。但对我来说,一件大事是可读性
newhashset(myList)
myList.stream().collect(Collectors.toSet())
更容易理解,不管函数式编程的传播者对后者有多兴奋。所以,只要将list转换为set,与传统方法相比,使用java 8并不能提高性能,因此我应该坚持使用传统方法来实现相同的性能。@Tusharbanen是正确的(但无论如何,您不应该基于微观性能假设编写代码-坚持最具可读性的方法。)Java 8 stream API并不是为这些类型的操作而设计的,它提供了编写更简洁、功能性更强的代码的能力。您可以看到上面的示例,我们在ArrayList中添加了重复的Person对象,并在使用StreamAPI将其转换为list之后,我们只得到唯一值,没有重复值。复制并运行此代码一次。我希望,您将获得清晰的图片。速记:
set.forEach(System.out::println)
Please find below code to concert List to Set using **stream API of java 8**

package streamapi;
import java.util.*;
import java.util.stream.Collector;
import java.util.stream.Collectors;
class Person{
    int empid;
    String name;

    Person(int empid,String name){
        this.empid = empid;
        this.name = name;
    }

    public String toString(){
        return "id"+this.empid+"name"+this.name;
    }

    public boolean equals(Object obj) {
        Person p = (Person)obj;
        if(p.empid==this.empid && p.name.equals(this.name)) {
            return true;
        }
        return false;
    }

    public int hashCode() {
        return this.empid+this.name.hashCode();
    }
}

public class collectionFilter {

    public static void main(String[] args) {
        List<Person> list = new ArrayList();
        list.add(new Person(101,"aaa"));
        list.add(new Person(200,"bbbb"));
        list.add(new Person(150,"ccccc"));
        list.add(new Person(250,"ddddd"));
        list.add(new Person(250,"ddddd"));

        converListToSet(list);
    }

    public static void converListToSet(List<Person> list) {
        Set<Person> set = list.stream()
                .collect(Collectors.toSet());
        set.forEach(person->System.out.println(person));
    }
}


Output like this:
id200namebbbb
id101nameaaa
id150nameccccc
id250nameddddd