如何从实例中获取供应商?

时间:2017-07-17 10:44:23

标签: java java-stream

我使用java8中的流API,当我将一个对象映射到另一个对象并将该对象传递给期望供应商的方法时遇到了问题,我得到了一个编译错误。如何将此对象传递给方法?

为了更好的解释,我写了以下代码:

List<Integer> l = a.stream()
     .map(B::mapFrom)
     .map((b)-> ((Supplier) () -> b)      // map to supplier
     .map(SimpleTest::mapSomethingElseWith)
     .collect(Collectors.toList());

我当前(丑陋)的解决方案如下所示:

//field "search";
var pattern = /[?&]search=/;
var URL = location.search;

if(pattern.test(URL))
{
    alert("Found :)");
}else{
    alert("Not found!");
}

存在类似但更具表现力的东西?

2 个答案:

答案 0 :(得分:2)

如何合并最后两个map

List<Integer> l = a.stream()
     .map(B::mapFrom)
     .map(b -> SimpleTest.mapSomethingElse (() -> b))
     .collect(Collectors.toList());

答案 1 :(得分:1)

当你写:

 List<Integer> l = a.stream()
         .map(B::mapFrom)

Stream<B>方法返回mapFrom()时,您获得B

 public static B mapFrom(A a){...}

然后,您将Stream<B>与:

链接起来
.map(SimpleTest::mapSomethingElseWith); 

mapToSomethingElseWith()定义为mapToSomethingElseWith(Supplier<B> b)

因此,编译器希望mapToSomethingElseWith()方法具有参数Supplier<B>而不是B,但是您将B变量传递给。

解决问题的一种方法是使用map()方法,使用显式lambda调用mapToSomethingElseWith() Supplier<B>

()-> b其中b是lambda的B类型的参数是Supplier<B>。 它确实没有arg,它返回一个B实例。

你可以写:

map(SimpleTest::mapSomethingElseWith);
  List<Integer> l = a.stream()
     .map(B::mapFrom)          
     .map(b->SimpleTest.mapToSomethingElseWith(()-> b) )
     .collect(Collectors.toList());