为什么此函数<List <Person>,String>不起作用?

时间:2019-07-23 16:00:00

标签: java java-8

我正在研究Function,并且我已经尝试过

Function<Person,String> byName = Person::getName;
System.out.println( byName.apply(list.get(1)) );

这有效并在索引1上打印了人的名字;

但是现在我想创建Function<List<Person>,String>以遍历所有对象 名单中的人

Function<List<Person>,String> allNames = a -> a.forEach(e-> e.getName());
System.out.println(allNames.apply(list));

它引发错误,因为“ void无法转换为字符串”

2 个答案:

答案 0 :(得分:2)

forEach()接受一个使用者,该使用者将一个功能应用于每个元素。它不返回任何内容,因此您不能在System.out.println()调用中使用它。如果您想返回来自forEach()的内容,则有可能需要时stream(),然后致电map()

但是,为了更接近第一个示例,您可能希望改为调用列表中的forEach(),然后在该位置的每个元素上打印出函数的结果:

Function<Person, String> byName = Person::getName;
list.forEach(e -> System.out.println(byName.apply(e.getName())));

答案 1 :(得分:0)

功能包具有这两个功能接口

  1. 供应商
  2. 消费者

根据文档->

  

如果什么都不做,但会返回一些东西,请使用供应商。

     

如果需要处理,但不返回任何内容,请使用Consumer。

下面的代码片段解决了我的问题->

    Consumer<List<Person>> allNames = (a) -> a.forEach(e -> System.out.print(e.getName()+" "));
    allNames.accept(list);