我试图让Java 8流等同于这个旧的学校代码。
Set<String> studentNames = new HashSet<String>();
for(Student student : students){
String name =(student.getName());
studentNames.add(transform(name));
}
Student是内部静态类,而我需要从非静态方法调用api。 transform是一种静态方法。 我试过这样的东西,但它没有编译..我得到编译器错误,因为静态引用不能用非静态方法...
studentNames = Stream.of(students)
.filter(Objects::nonNull)
.map(Student::getName)
.map(Transformer::transform)
.collect(Collectors.toSet());
答案 0 :(得分:1)
好像你的问题在这里Transformer::transform
,你需要transformer
的实际实例才能使这项工作成功。
Transformer t = new Transformer(...);
list.stream()
.filter(Objects::nonNull)
.map(Student::getName)
.map(t::transform)
.collect(Collectors.toSet());
看起来Transformer
只是Function<String, String>
顺便说一句。
答案 1 :(得分:1)
正如霍尔格在评论中所说,你的问题是由Stream.of(students)
打来的。如果您查看of
的签名,您会发现它需要单个元素或数组元素。因此,如果你给它一个集合,你将得到一个集合流,而不是集合的元素:
Stream<String> s1 = Stream.of("hello");
Stream<String> s2 = Stream.of("hello", "world");
Stream<String> s3 = Stream.of(new String[] {"hello", "world"});
Stream<List<String>> s4 = Stream.of(Arrays.asList("hello", "world"));
Stream<String> s5 = Arrays.asList("hello", "world").stream();