【发布时间】:2016-06-24 18:26:20
【问题描述】:
我正在努力学习Java的Set接口,在网上遇到了下面的代码,我明白这段代码的目的是将一个Collection<Object>转换成一个TreeSet,但是我不明白如何语句有效,因为语法对我来说很复杂且陌生。有人可以逐步指导我完成整个过程吗?
Set<String> set = people.stream()
.map(Person::getName)
.collect(Collectors.toCollection(TreeSet::new));
另外,在什么样的情况下,我们应该更喜欢上面的语法而不是下面的语法?
Set<Integer> s1 = new TreeSet(c1); //where c1 is an instance of Collection interface type
【问题讨论】:
-
“还有,在什么情况下我们应该更喜欢上面的语法而不是下面的语法?” 它们做不同的事情,所以它们不能互换。
map操作只能通过流进行。 -
对不起,如果我的问题听起来很愚蠢,但他们不是都在创建 TreeSet 的实例吗?
-
是的,但是
map操作是第一个sn-p 的重点。你有例如List<Person>并希望将其转为Set<String>。你不能用TreeSet构造函数来做到这一点。 -
另外,哇,刚刚注意到一些完全不相关的东西。
new TreeSet(c1)真的很糟糕。这称为raw type,您可以通过这种方式造成堆污染。c1不必是Integer的集合。它可以是例如List<String>并且代码将编译,但是您只是偶然将String放入了Integer的Set中。很难调试,因为当您尝试从s1中提取内容时,您会在完全不同的地方得到ClassCastException。 (不过,编译器会警告你。)
标签: java collections set java-8 java-stream