我是java8 lambda表达式的新手,我正在尝试将我的代码调整为lambda表达式,我有以下代码:
TimeZoneObj timezone;
for( myObject obj: objectArr)
{
if((obj.getName).equal("timeZone"))
{
timezone=db.getTmezone(obj.getId());
}
}
但我无法将其转换为lambda,任何人都可以帮助我将上面的代码转换为lambda然后这样我就有了一个模式开始吗?
答案 0 :(得分:3)
这应该有效
TimeZone timezone = Arrays.stream(objectArr)
.filter(obj -> obj.getName().equals("timeZone")) //filters (i think you know how that work)
.map(obj -> db.getTmezone(obj.getId())) //this is actually what you needed.
.findAny().get();
但请记住,它可以抛出NoSuchElementException
(如果它没有找到任何值)。为确保不会这样做,您可以使用orElse(TimeZone)
代替get()
来提供默认时区
.map()
使用提供的Stream<YourObject>
将Stream<TimeZone>
转换为Function<YourObject, TimeZone>
。基本上代码需要YourObject
并返回TimeZone
。在这种情况下,它是db.getTimezone(obj.getId())
PS。明确地将TimeZone
替换为TimeZoneObj
PPS。有关.map()
如何工作的更多信息。让我们从java.util.function.Function
接口开始。它是一个只需要实现一个方法apply()
的接口,这使它成为一个功能接口。它接受一种类型的对象并返回另一种类型的对象。有点像java中的常规方法,你可以作为参数传递。
那么,.map()
执行的操作需要Function
并使用它将原始Stream<SomeObject>
转换为新Stream<AnotherObject>
。使用该方法的完整方法如下
foo.stream().<AnotherObject>map(new Function<SomeObject, AnotherObject>() {
@Override
public AnotherObject apply(SomeObject obj) {
return sample.conversion.ofSomeObject.toAnotherObject(obj);
}
})
关于<AnotherObject>map()
。 map()
实际上是一种通用方法。您可以指定此方法在尖括号内的实际调用之前将使用的对象类型(通用)。在这种情况下,.map()
将该对象类型用作新流的类型。现在,java实际上足够聪明,可以从返回类型Function
获取该类型,因此您无需显式编写它。
new Function<SomeObject, AnotherObject>() {}
是一个匿名界面(在使用lambdas之前你必须要了解它)。它完成它所说的。它有.apply()
方法,它将SomeObject
作为参数并返回AnotherObject
(它在上面的泛型中指定)。 .map()
稍后可以使用该方法转换Stream
s
但这是一大堆无用的代码。所以,lambdas来帮忙,你可以用一行lambda替换6行匿名接口
(obj -> sample.conversion.ofSomeObject.toAnotherObject(obj))
(我希望你能理解lambdas是什么)。