Java 8在非静态方法中映射内部静态类属性

时间:2017-09-20 06:13:27

标签: java java-stream

我试图让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());

2 个答案:

答案 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();
相关问题