我使用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!");
}
存在类似但更具表现力的东西?
答案 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());