如果将自定义对象作为返回对象转换为lambda

时间:2016-02-07 05:52:38

标签: lambda java-8

我是java8 lambda表达式的新手,我正在尝试将我的代码调整为lambda表达式,我有以下代码:

TimeZoneObj  timezone;

for( myObject obj: objectArr)
{
  if((obj.getName).equal("timeZone"))
    {
      timezone=db.getTmezone(obj.getId());
    }
}

但我无法将其转换为lambda,任何人都可以帮助我将上面的代码转换为lambda然后这样我就有了一个模式开始吗?

1 个答案:

答案 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是什么)。