使用for循环、if和获取if中的自定义对象作为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吗?这样我就有了一个

我是java8 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我能想到的最好的方法是使用不同过滤器的两个不同流。一个流不能返回两个不同类型的对象。