英语原文地址:https://www.javaguides.net/2020/03/java-lambda-expressions-examples.html

作者:Ramesh Fadatare

翻译:高行行

在本教程中,我们将看到Java中约11个有用的Lambda表达式示例。

Java 8 Lambda表达式语法

Java Lambda表达式语法

  1. (argument-list) -> {body}

Java lambda表达式包含三个组件。

  1. 参数列表:也可以为空或非空。
  2. 箭头标记:用于链接参数列表和表达式主体。
  3. 正文:包含lambda表达式的表达式和语句。

Java Lambda表达式示例

1. Java简单Lambda表达式示例

在这里,我们使用lambda表达式实现Drawable功能接口方法:

  1. interface Drawable{
  2. public void draw();
  3. }
  4. public class LambdaExpressionExample {
  5. public static void main(String[] args) {
  6. int width=10;
  7. //with lambda
  8. Drawable withLambda=()->{
  9. System.out.println("Drawing "+width);
  10. };
  11. withLambda.draw();
  12. }
  13. }

输出:

  1. Drawing 10

2. Java Lambda表达式示例:无参数

请参考代码中的注释,该注释指示具有Lambda表达式和不具有Lambda表达式的代码。

  1. interface Sayable {
  2. public String say();
  3. }
  4. public class JLEExampleNoParameter {
  5. public static void main(String[] args) {
  6. // without lambda expression
  7. Sayable sayable = new Sayable() {
  8. @Override
  9. public String say() {
  10. return "Return something ..";
  11. }
  12. };
  13. sayable.say();
  14. // with lambda expression
  15. Sayable withLambda = () -> {
  16. return "Return something ..";
  17. };
  18. withLambda.say();
  19. }
  20. }

3. Java Lambda表达式示例:单参数

请参考代码中的注释,该注释指示具有Lambda表达式和不具有Lambda表达式的代码。

  1. interface Printable {
  2. void print(String msg);
  3. }
  4. public class JLEExampleSingleParameter {
  5. public static void main(String[] args) {
  6. // without lambda expression
  7. Printable printable = new Printable() {
  8. @Override
  9. public void print(String msg) {
  10. System.out.println(msg);
  11. }
  12. };
  13. printable.print(" Print message to console....");
  14. // with lambda expression
  15. Printable withLambda = (msg) -> System.out.println(msg);
  16. withLambda.print(" Print message to console....");
  17. }
  18. }

输出:

  1. Print message to console....
  2. Print message to console....

4. Java Lambda表达式示例:多个参数

请参考代码中的注释,该注释指示具有Lambda表达式和不具有Lambda表达式的代码。

  1. interface Addable{
  2. int add(int a,int b);
  3. }
  4. public class JLEExampleMultipleParameters {
  5. public static void main(String[] args) {
  6. // without lambda expression
  7. Addable addable = new Addable() {
  8. @Override
  9. public int add(int a, int b) {
  10. return a + b;
  11. }
  12. };
  13. addable.add(10, 20);
  14. // with lambda expression
  15. // Multiple parameters in lambda expression
  16. Addable withLambda = (a,b)->(a+b);
  17. System.out.println(withLambda.add(10,20));
  18. // Multiple parameters with data type in lambda expression
  19. Addable withLambdaD = (int a,int b) -> (a+b);
  20. System.out.println(withLambdaD.add(100,200));
  21. }
  22. }

5. Java Lambda表达式示例:多个语句

  1. interface IAvarage{
  2. double avg(int[] array);
  3. }
  4. public class JLEExampleMultipleStatements {
  5. public static void main(String[] args) {
  6. // without lambda expression, IAvarage implementation using anonymous class
  7. IAvarage avarage = new IAvarage() {
  8. @Override
  9. public double avg(int[] array) {
  10. double sum = 0;
  11. int arraySize = array.length;
  12. System.out.println("arraySize : " + arraySize);
  13. for (int i = 0; i < array.length; i++) {
  14. sum = sum + array[i];
  15. }
  16. System.out.println("sum : " + sum);
  17. return (sum/ arraySize);
  18. }
  19. };
  20. int[] array = {1,4,6,8,9};
  21. System.out.println(avarage.avg(array));
  22. // with a lambda expression
  23. // You can pass multiple statements in lambda expression
  24. IAvarage withLambda = (withLambdaArray) -> {
  25. double sum = 0;
  26. int arraySize = withLambdaArray.length;
  27. System.out.println("arraySize : " + arraySize);
  28. for (int i = 0; i < withLambdaArray.length; i++) {
  29. sum = sum + withLambdaArray[i];
  30. }
  31. System.out.println("sum : " + sum);
  32. return (sum/ arraySize);
  33. };
  34. int[] withLambdaArray = {1,4,6,8,9};
  35. System.out.println(withLambda.avg(withLambdaArray));
  36. }
  37. }

6. Java Lambda表达式示例:创建线程

  1. public class JLEExampleRunnable {
  2. public static void main(String[] args) {
  3. //without lambda, Runnable implementation using anonymous class
  4. Runnable runnable = new Runnable() {
  5. @Override
  6. public void run() {
  7. System.out.println(" Runnable example without lambda exp.");
  8. }
  9. };
  10. Thread thread = new Thread(runnable);
  11. thread.start();
  12. //with lambda
  13. Runnable withLambda = () -> System.out.println(" Runnable example with lambda exp.");
  14. Thread thread1 = new Thread(withLambda);
  15. thread1.start();
  16. }
  17. }

输出:

  1. Runnable example without lambda exp.
  2. Runnable example with lambda exp.

7. Java Lambda表达式示例:比较器

  1. import java.util.ArrayList;
  2. import java.util.Collections;
  3. import java.util.Comparator;
  4. import java.util.List;
  5. public class JLEComparatorExample {
  6. public static void main(String[] args) {
  7. List<Person> listOfPerson = new ArrayList<Person>();
  8. listOfPerson.add(new Person("abc", 27));
  9. listOfPerson.add(new Person("mno", 26));
  10. listOfPerson.add(new Person("pqr", 28));
  11. listOfPerson.add(new Person("xyz", 27));
  12. // Without lambda expression.
  13. // Sort list by age
  14. Comparator<Person> comparator = new Comparator<Person>() {
  15. @Override
  16. public int compare(Person o1, Person o2) {
  17. return o1.getAge() - o2.getAge();
  18. }
  19. };
  20. Collections.sort(listOfPerson, comparator);
  21. System.out.println(" sort persons by age in ascending order");
  22. for (Person person : listOfPerson) {
  23. System.out.println(" Person name : " + person.getName());
  24. }
  25. // Witht lambda expression.
  26. // Sort list by age
  27. Collections.sort(listOfPerson, (Person o1, Person o2) -> {
  28. return o1.getAge() - o2.getAge();
  29. });
  30. // Use forEach method added in java 8
  31. System.out.println(" sort persons by age in ascending order");
  32. listOfPerson.forEach(
  33. (person) -> System.out.println(" Person name : " + person.getName()));
  34. }
  35. }
  36. class Person {
  37. private String name;
  38. private int age;
  39. public Person(String name, int age) {
  40. super();
  41. this.name = name;
  42. this.age = age;
  43. }
  44. public String getName() {
  45. return name;
  46. }
  47. public void setName(String name) {
  48. this.name = name;
  49. }
  50. public int getAge() {
  51. return age;
  52. }
  53. public void setAge(int age) {
  54. this.age = age;
  55. }
  56. }

8. Java Lambda表达式示例:事件监听器

  1. import javax.swing.JButton;
  2. import javax.swing.JFrame;
  3. import javax.swing.JTextField;
  4. public class LambdaEventListenerExample {
  5. public static void main(String[] args) {
  6. JTextField tf=new JTextField();
  7. tf.setBounds(50, 50,150,20);
  8. JButton b=new JButton("click");
  9. b.setBounds(80,100,70,30);
  10. // lambda expression implementing here.
  11. b.addActionListener(e-> {tf.setText("hello swing");});
  12. JFrame f=new JFrame();
  13. f.add(tf);f.add(b);
  14. f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  15. f.setLayout(null);
  16. f.setSize(300, 200);
  17. f.setVisible(true);
  18. }
  19. }

9.使用forEach()方法和Lambda表达式示例迭代ArrayList

  1. package net.javaguides.collections;
  2. import java.util.Arrays;
  3. import java.util.Iterator;
  4. import java.util.List;
  5. /**
  6. *
  7. * Java program to demonstrate different ways to Iterate over an ArrayList in Java
  8. * @author Ramesh Fadatare
  9. *
  10. */
  11. public class DifferentWaysListIterateProgram {
  12. public static void main(String...args) {
  13. List < String > courses = Arrays.asList("C", "C++", "Core Java", "J2EE", "Spring", "Hibernate", "Python");
  14. // JDK 8 streaming example lambda expression
  15. courses.stream().forEach(course - > printCourse(course));
  16. // JDK 8 streaming example method reference
  17. courses.stream().forEach(DifferentWaysListIterateProgram::printCourse);
  18. // JDK 8 for each with lambda
  19. courses.forEach(course - > printCourse(course));
  20. // JDK 8 for each
  21. courses.forEach(DifferentWaysListIterateProgram::printCourse);
  22. }
  23. // common method to print course
  24. private static void printCourse(String course) {
  25. System.out.println("course name :: " + course);
  26. }
  27. }

10.使用forEach()方法和Lambda表达式示例迭代HashSet

  1. package net.javaguides.collections;
  2. import java.util.HashSet;
  3. import java.util.Iterator;
  4. import java.util.Set;
  5. /**
  6. * Java program to demonstrate different ways to iterate over a Set in Java
  7. *
  8. * @author Ramesh Fadatare
  9. *
  10. */
  11. public class DifferentWaysSetIterateProgram {
  12. public static void main(String...args) {
  13. Set < String > courses = new HashSet < String > ();
  14. courses.add("Java");
  15. courses.add("C");
  16. courses.add("C++");
  17. courses.add("Python");
  18. courses.add("Scala");
  19. // JDK 8 streaming example lambda expression
  20. courses.stream().forEach(course - > coursePrinter(course));
  21. // JDK 8 streaming example method reference
  22. courses.stream().forEach(DifferentWaysSetIterateProgram::coursePrinter);
  23. // JDK 8 for each with lambda
  24. courses.forEach(course - > coursePrinter(course));
  25. // JDK 8 for each
  26. courses.forEach(DifferentWaysSetIterateProgram::coursePrinter);
  27. }
  28. // common method to print course
  29. private static void coursePrinter(String course) {
  30. System.out.println("course name :: " + course);
  31. }
  32. }

11.使用forEach()方法和Lambda表达式示例迭代HashMap

  1. package net.javaguides.collections;
  2. import java.util.HashMap;
  3. import java.util.Iterator;
  4. import java.util.Map;
  5. /**
  6. * This program demonstrate different ways to iterate over a Map in Java
  7. *
  8. * @author Ramesh Fadatare
  9. *
  10. */
  11. public class DifferentWaysMapIterateProgram {
  12. public static void main(String...args) {
  13. Map < Integer, String > coursesMap = new HashMap < Integer, String > ();
  14. coursesMap.put(1, "C");
  15. coursesMap.put(2, "C++");
  16. coursesMap.put(3, "Java");
  17. coursesMap.put(4, "J2EE");
  18. coursesMap.put(5, "Python");
  19. coursesMap.put(6, "Scala");
  20. // JDK 8 for each with lambda
  21. coursesMap.forEach((k, v) - > coursePrinter(k, v));
  22. // JDK 8 for each method reference
  23. coursesMap.forEach(DifferentWaysMapIterateProgram::coursePrinter);
  24. }
  25. // common method to print map key value
  26. private static void coursePrinter(Integer number, String brand) {
  27. System.out.println("course no : " + number + " and course name : " + brand);
  28. }
  29. }

参考文献