java lambda函数_番石榴函数和Java 8 Lambdas

java lambda函数

我最近阅读了Brian Goetz的《 Lambda的状况》 ,在阅读了该文章之后,我想尝试使用Java 8 Lambda表达式。 Brian在他的文章中继续描述了将一种方法称为“功能”接口的接口。 功能接口几乎总是用作匿名类,其中ActionListener是规范示例。 这些“功能性”接口是lambda表达式的最初目标,主要目标是删除许多使用它们的样板或仪式。 当我在Guava库上编写系列文章时,立即想到了Function接口,它是尝试使用lambda表达式的主要候选对象。

我的目标很简单,请从我的Guava Futures博客中进行单元测试(它大量使用Function接口)并将其转换为使用lambda表达式。 虽然我将介绍与所举示例有关的lamba表达式的结构,但本文并非是有关Java 8 lambda表达式的教程。 而是记录了我在Java中使用lambda表达式的首次尝试。

Lambda表达式

第一个示例是对Futures.chain方法的测试,该方法将Function作为其参数之一:

Function<List<String>, ListenableFuture<List<Person>>> queryFunction =
      new Function<List<String>, ListenableFuture<List<Person>>>() {
            @Override
            public ListenableFuture<List<Person>> apply(final List<String> ids) {
                 return dbService.getPersonsByIdAsync(ids);
            }
        };

ListenableFuture<List<String>> indexSearch = 
      luceneSearcher.searchAsync('firstName:martin');
ListenableFuture<List<Person>> results = 
      Futures.chain(indexSearch,queryFunction,executorService);

使用lamba表达式,现在看起来像:

Function<List<String>, ListenableFuture<List<Person>>> queryFunction =
      ids ->(dbService.getPersonsByIdAsync(ids));

  ListenableFuture<List<String>> indexSearch = 
      luceneSearcher.searchAsync('firstName:martin');
  ListenableFuture<List<Person>>results = 
      Futures.chain(indexSearch, queryFunction,executorService);

请记住,从上面的代码示例中,两个突出显示的部分是等效的。 让我们看一下第2行,并说明这与第一个代码示例中的1-7行如何匹配

  1. ids是apply方法的输入,并且对应于第一个代码示例中第4行的final List<String> ids参数。 lamba表达式的类型是从使用它的上下文中推断出来的,因此我们不需要为ids参数重复它们。
  2. 然后是箭头(->)令牌,它是当前形式的Java 8 lambda表达式的常规语法的一部分
  3. 然后,我们得到了lambda的主体(dbService.getPersonsByIdAsync(ids)),该主体是一个方法调用,该方法返回一个ListenableFuture,而后者又产生一个Person对象列表。 请注意,我们不必放入return语句,因为这是单个表达式,并且可以求值并返回。

下一个示例是测试中的实用程序方法,该方法通过将匿名Callable实例传递到ExecutorService中来返回ListenableFutures:

private ListenableFuture<List<Person>> getPersonsByFirstNameFuture(final String firstName, final boolean error) {
return executorService.submit(new Callable<List<Person>>() {
            @Override
            public List<Person> call() throws Exception {
                startSignal.await();
                if (error) {
                    throw new RuntimeException('Ooops!');
                }
                List<String> ids = luceneSearcher.search('firstName:' + firstName);
                return dbService.getPersonsById(ids);
            }
        });
}

这是使用lambda表达式的等效项:

private ListenableFuture<List<Person>> getPersonsByFirstNameFuture(final String firstName, final boolean error) {
 return executorService.submit(() -> {startSignal.await();
                                       if (error) {
                                        throw new RuntimeException('Ooops!');
                                       }
                                     List<String> ids = luceneSearcher.search('firstName:' + firstName);
                                     return dbService.getPersonsById(ids);
                                  });
}

在此示例中,没有输入参数,因此表达式在第2行以空括号()开头。存在->标记,但是在此示例中,主体包含由{…}包围的多个语句。 由于存在多个语句,因此在第7行需要显式return语句。

运行Java 8的环境

我当前的笔记本电脑是MacBook Pro,因此我需要设置一个环境以运行具有lambda支持的Java 8。 这是我采取的步骤:

  1. 在VirtualBox上安装了LinuxMint 12。
  2. 创建一个目录并与LinuxMint来宾共享
  3. 安装了Java 8的开发人员预览版
  4. 为了从现有的Maven项目中获取源代码并测试源代码,我运行了mvn jar:jar jar:test-jar并将生成的jar文件放在共享目录中
  5. 将所有依赖项放在共享目录中(guava,lucene,h2和junit)
  6. 重新编写单元测试以使用lambda,然后从命令行运行新测试

结论

尽管要发布支持lambda的Java 8尚需时日,但开发人员预览版中提供的功能似乎很有希望。感谢您的时间,一如既往地欢迎提出意见和建议

资源资源


参考:来自我们的JCG合作伙伴 Bill Bejeck的Guava Functions&Java 8 Lambdas,来自Random Thoughts On Coding博客。

翻译自: https://www.javacodegeeks.com/2012/11/guava-functions-java-8-lambdas.html

java lambda函数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值