最近我发现了Java 8的新语法,可以用来将列表转换为集合:
Set<Integer> myset = mylist.stream().collect(Collectors.toSet()));
我想了解使用这种方法将列表转换为集合的优势,与传统方法(通过将其作为参数传递给HashSet)相比。
最近我发现了Java 8的新语法,可以用来将列表转换为集合:
Set<Integer> myset = mylist.stream().collect(Collectors.toSet()));
优点在于这样可以更容易地(或者更准确地说,需要较少的语法改变)同时执行其他函数操作。
比如说以后你只想要集合中的偶数,你可以轻松地使用筛选器实现:
Set<Integer> myset = mylist.stream()
.filter(p -> p%2==0)
.collect(Collectors.toSet());
(这并不意味着它总是更好-可能有一些情况下,您希望阻止将来的某个人更改代码以过滤值,在这种情况下,您可以认为传统的方式仍然比较可取。)
您可以直接使用这段精确的代码:
Set<Integer> myset = new HashSet<>(mylist);
就是这样。
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));
}
}
id200namebbbb
id101nameaaa
id150nameccccc
id250nameddddd
set.forEach(System.out::println)
- Mr. Polywhirl
new HashSet(mylist)
相比没有任何优势。如果你想要过滤或映射你的流(stream),那么使用它就有优势。 - khelwoodHashSet
的构造函数,使其能够高效工作。使用stream()
并不是很好的选择。 - Dawood ibn KareemHashSet
的构造函数在插入元素之前将内部映射初始化为合理大小? - Michaelnew HashSet(myList)
比myList.stream().collect(Collectors.toSet())
更容易理解,无论函数式编程的传道者们对后者有多么兴奋。 - Dawood ibn Kareem