使用for循环、if和获取if中的自定义对象作为lambda的返回对象来转换代码
我是java8 lambda表达式的新手,我正在尝试使我的代码适应lambda表达式,我有以下代码:使用for循环、if和获取if中的自定义对象作为lambda的返回对象来转换代码,lambda,java-8,Lambda,Java 8,我是java8 lambda表达式的新手,我正在尝试使我的代码适应lambda表达式,我有以下代码: TimeZoneObj timezone; for( myObject obj: objectArr) { if((obj.getName).equal("timeZone")) { timezone=db.getTmezone(obj.getId()); } } 但是我不能把它转换成lambda,有人能帮我把上面的代码转换成lambda吗?这样我就有了一个
TimeZoneObj timezone;
for( myObject obj: objectArr)
{
if((obj.getName).equal("timeZone"))
{
timezone=db.getTmezone(obj.getId());
}
}
但是我不能把它转换成lambda,有人能帮我把上面的代码转换成lambda吗?这样我就有了一个开始的模式了?这应该行得通
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();
但请记住,它可以抛出一个NoTouchElementException
(如果它没有找到任何值)。为了确保它不会这样做,您可以使用orElse(TimeZone)
而不是get()
来提供默认时区
.map()
使用提供的函数
将流
转换为流
。基本上是获取YourObject
并返回TimeZone
的代码。在本例中,它是db.getTimezone(obj.getId())
注:用你的TimeZoneObj
替换TimeZone
PPS。有关.map()
工作原理的详细信息。让我们从java.util.function.function
接口开始。它是一个只需要实现一个方法apply()
的接口,这使它成为一个功能接口。它接受一种类型的对象并返回另一种类型的对象。有点像java中的常规方法,可以作为参数传递。
因此,.map()
所做的是它接受一个函数
,并使用它将原始流
转换为新的流
。使用该方法的完整方法如下
foo.stream().<AnotherObject>map(new Function<SomeObject, AnotherObject>() {
@Override
public AnotherObject apply(SomeObject obj) {
return sample.conversion.ofSomeObject.toAnotherObject(obj);
}
})
foo.stream().map(新函数(){
@凌驾
公共另一个对象应用(SomeObject obj){
返回某个对象到另一个对象(obj)的转换示例;
}
})
关于map()
map()
实际上是一种通用方法。您可以在尖括号内的实际调用之前指定此方法将使用的对象类型(通用)。在本例中,.map()
将该对象类型用作新流的类型。现在,java实际上足够聪明,可以从函数的返回类型
中获取该类型,所以您不需要显式地编写它
new Function(){}
是一个匿名接口(在使用lambdas之前,您必须了解这个接口)。它言行一致。它有.apply()
方法,该方法将某个对象
作为参数,并返回另一个对象(在上面的泛型中指定).map()
以后可以使用该方法转换流
s
但这是大量无用的代码。因此,lambda提供帮助,您可以用一行lambda替换6行匿名接口(obj->sample.conversion.ofSomeObject.toAnotherObject(obj))
(我有点希望你理解lambdas是什么)。你是指流API?@Meegoo我认为对于过滤部分,我们需要使用流,但我不确定如何转换这部分:timezone=db.getTmezone(obj.getId());谢谢你解释这行:.map(obj->db.getTmezone(obj.getId())//这实际上是你需要的。这段代码不能返回null
。方法.get()
将为一个空的可选项抛出异常。@霍尔格,谢谢,我从未注意到这点。@HamedMinaee是的。但是在.orElse()
中,您必须指定默认时区,如果在数组中找不到,则将使用默认时区(仅.orElse(timezone)
显然不起作用,除非timezone
是您类型的对象TimeZoneObj
)。此外,如果objectArr
不是数组,而是java.util.List
,则必须将Arrays.stream(objectArr)
替换为objectArr.stream()
。但从名称上看,我猜它只是一个默认数组,因此代码应该可以工作。@hamedminae我能想到的最好的方法是使用不同过滤器的两个不同流。一个流不能返回两个不同类型的对象。