前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java 8中引入的forEach

Java 8中引入的forEach

作者头像
崔笑颜
发布2020-06-08 16:53:14
1.2K0
发布2020-06-08 16:53:14
举报

概述

在Java 8中引入的forEach循环为程序员提供了一种新的,简洁而有趣的迭代集合的方式。

在本文中,我们将看到如何将forEach与集合一起使用,它采用何种参数以及此循环与增强的for循环的不同之处。

基础知识

代码语言:javascript
复制
public interface Collection<E> extends Iterable<E>

Collection 接口实现了 Iterable 接口,而 Iterable 接口在 Java 8开始具有一个新的 API:

代码语言:javascript
复制
void forEach(Consumer<? super T> action)//对 Iterable的每个元素执行给定的操作,直到所有元素都被处理或动作引发异常。

使用forEach,我们可以迭代一个集合并对每个元素执行给定的操作,就像任何其他迭代器一样。

例如,迭代和打印字符串集合的for循环版本:

代码语言:javascript
复制
for (String name : names) {
    System.out.println(name);
}

我们可以使用forEach写这个 :

代码语言:javascript
复制
names.forEach(name -> {
    System.out.println(name);
});

匿名类

我们使用 forEach迭代集合并对每个元素执行特定操作。要执行的操作包含在实现Consumer接口的类中,并作为参数传递给forEach 。

所述消费者接口是一个功能接口(具有单个抽象方法的接口)。它接受输入并且不返回任何结果。

Consumer 接口定义如下:

代码语言:javascript
复制
@FunctionalInterface
public interface Consumer {
    void accept(T t);
}

任何实现,例如,只是打印字符串的消费者:

代码语言:javascript
复制
Consumer<String> printConsumer = new Consumer<String>() {
    public void accept(String name) {
        System.out.println(name);
    };
};

可以作为参数传递给forEach:

代码语言:javascript
复制
names.forEach(printConsumer);

但这不是通过消费者和使用forEach API 创建操作的唯一方法。让我们看看我们将使用forEach方法的另外2种最流行的方式:

Lambda表达式

Java 8功能接口的主要优点是我们可以使用Lambda表达式来实例化它们,并避免使用庞大的匿名类实现。

由于 Consumer 接口属于函数式接口,我们可以通过以下形式在Lambda中表达它:

代码语言:javascript
复制
(argument) -> { body }
name -> System.out.println(name)
names.forEach(name -> System.out.println(name));

方法参考 我们可以使用方法引用语法而不是普通的Lambda语法,其中已存在一个方法来对类执行操作:

代码语言:javascript
复制
names.forEach(System.out::println);
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-01-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 概述
  • 基础知识
  • 匿名类
  • Lambda表达式
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档