原文:http://zetcode.com/java/foreach/

Java forEach教程显示了如何使用 Java8 forEach()方法。 我们与消费者合作,并在列表,映射和集合集合上展示forEach()

forEach()方法是 Java8 中引入的。它为程序员提供了一种新的,简洁的迭代集合的方法。

forEach()方法对Iterable的每个元素执行给定的操作,直到所有元素都已处理或该操作引发异常。

  1. void forEach(Consumer<? super T> action);

这是forEach()方法的语法。

Consumer接口

Consumer接口是一个函数式接口(具有单个抽象方法的接口),它接受单个输入并且不返回结果。

  1. @FunctionalInterface
  2. public interface Consumer {
  3. void accept(T t);
  4. }

这是Consumer接口的定义。

com/zetcode/JavaForEachListConsumer.java

  1. package com.zetcode;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import java.util.function.Consumer;
  5. public class JavaForEachListConsumer {
  6. public static void main(String[] args) {
  7. List<String> items = new ArrayList<>();
  8. items.add("coins");
  9. items.add("pens");
  10. items.add("keys");
  11. items.add("sheets");
  12. items.forEach(new Consumer<String>() {
  13. @Override
  14. public void accept(String name) {
  15. System.out.println(name);
  16. }
  17. });
  18. }
  19. }

在此示例中,我们使用forEach()遍历字符串列表。 Java lambda 表达式可以缩短此语法。

Lambda 表达式

Lambda 表达式主要用于定义函数式接口的内联实现,即仅具有单个方法的接口。 Lambda 表达式是使用-> lambda 运算符创建的。

com/zetcode/JavaForEachListLambda.java

  1. package com.zetcode;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import java.util.function.Consumer;
  5. public class JavaForEachListLambda {
  6. public static void main(String[] args) {
  7. List<String> items = new ArrayList<>();
  8. items.add("coins");
  9. items.add("pens");
  10. items.add("keys");
  11. items.add("sheets");
  12. items.forEach((String name) -> {
  13. System.out.println(name);
  14. });
  15. }
  16. }

这里我们有同样的例子。 lambda 表达式使示例更简洁。

Java 映射上的forEach

以下示例在映射上使用forEach()

com/zetcode/JavaForEachMap.java

  1. package com.zetcode;
  2. import java.util.HashMap;
  3. import java.util.Map;
  4. public class JavaForEachMap {
  5. public static void main(String[] args) {
  6. Map<String, Integer> items = new HashMap<>();
  7. items.put("coins", 3);
  8. items.put("pens", 2);
  9. items.put("keys", 1);
  10. items.put("sheets", 12);
  11. items.forEach((k, v) -> {
  12. System.out.printf("%s : %d%n", k, v);
  13. });
  14. }
  15. }

我们有一个字符串/整数对的映射。 使用forEach()方法,我们遍历映射并打印其键/值对。

在下一个示例中,我们在代码中显式显示ConsumerMap.Entry

com/zetcode/JavaForEachMap2.java

  1. package com.zetcode;
  2. import java.util.HashMap;
  3. import java.util.Map;
  4. import java.util.function.Consumer;
  5. public class ForEachMap2 {
  6. public static void main(String[] args) {
  7. HashMap<String, Integer> map = new HashMap<>();
  8. map.put("cups", 6);
  9. map.put("clocks", 2);
  10. map.put("pens", 12);
  11. Consumer<Map.Entry<String, Integer>> action = entry ->
  12. {
  13. System.out.printf("key: %s", entry.getKey());
  14. System.out.printf(" value: %s%n", entry.getValue());
  15. };
  16. map.entrySet().forEach(action);
  17. }
  18. }

该示例在一个条目集上循环,该条目集是通过entrySet()检索的。

Java 集合上的forEach

以下示例在一个集合上使用forEach()

com/zetcode/JavaForEachSet.java

  1. package com.zetcode;
  2. import java.util.HashSet;
  3. import java.util.Set;
  4. public class JavaForEachSet {
  5. public static void main(String[] args) {
  6. Set<String> brands = new HashSet<>();
  7. brands.add("Nike");
  8. brands.add("IBM");
  9. brands.add("Google");
  10. brands.add("Apple");
  11. brands.forEach((e) -> { System.out.println(e); });
  12. }
  13. }

我们有一组字符串。 使用forEach()方法,我们遍历集合并打印其值。

在数组上使用 forEach

以下示例在数组上使用forEach()

com/zetcode/JavaForEachArray.java

  1. package com.zetcode;
  2. import java.util.Arrays;
  3. public class JavaForEachArray {
  4. public static void main(String[] args) {
  5. int[] nums = { 3, 4, 2, 1, 6, 7 };
  6. Arrays.stream(nums).forEach((e) -> { System.out.println(e); });
  7. }
  8. }

在示例中,我们有一个整数数组。 我们使用Arrays.stream()方法将数组转换为流。 然后forEach()方法遍历元素并将它们打印到控制台。

过滤列表

在使用forEach()遍历数据之前,我们可以轻松过滤数据。

com/zetcode/JavaForEachListFilter.java

  1. package com.zetcode;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. public class JavaForEachListFilter {
  5. public static void main(String[] args) {
  6. List<String> items = new ArrayList<>();
  7. items.add("coins");
  8. items.add("pens");
  9. items.add("keys");
  10. items.add("sheets");
  11. items.stream().filter(item -> (item.length() == 4)).forEach(System.out::println);
  12. }
  13. }

在此示例中,我们过滤字符串列表,并将过滤后的列表打印到控制台。 仅显示具有四个字符的字符串。

IntConsumerLongConsumerDoubleConsumer

从 Java8 开始,我们为原始数据类型内置了使用者接口:IntConsumerLongConsumerDoubleConsumer

com/zetcode/JavaForEachConsSpec.java

  1. package com.zetcode;
  2. import java.util.Arrays;
  3. import java.util.function.DoubleConsumer;
  4. import java.util.function.IntConsumer;
  5. import java.util.function.LongConsumer;
  6. public class JavaForEachConsSpec {
  7. public static void main(String[] args) {
  8. int[] inums = { 3, 5, 6, 7, 5 };
  9. IntConsumer icons = i -> System.out.print(i + " ");
  10. Arrays.stream(inums).forEach(icons);
  11. System.out.println();
  12. long[] lnums = { 13L, 3L, 6L, 1L, 8L };
  13. LongConsumer lcons = l -> System.out.print(l + " ");
  14. Arrays.stream(lnums).forEach(lcons);
  15. System.out.println();
  16. double[] dnums = { 3.4d, 9d, 6.8d, 10.3d, 2.3d };
  17. DoubleConsumer dcons = d -> System.out.print(d + " ");
  18. Arrays.stream(dnums).forEach(dcons);
  19. System.out.println();
  20. }
  21. }

在示例中,我们创建了三种类型的使用者,并使用forEach()对其进行了迭代。

在本教程中,我们介绍了 Java8 forEach()方法。 我们已经介绍了使用者,并在列表,映射和集合上使用了forEach()

您可能也对以下相关教程感兴趣: Java 教程用 Java8 的StringJoiner连接字符串Google Guava 简介Java 过滤列表Android 教程中的代码。

列出所有 Java 教程