英语原文地址:https://www.javaguides.net/2020/03/java-lambda-expressions-examples.html
作者:Ramesh Fadatare
翻译:高行行
在本教程中,我们将看到Java中约11个有用的Lambda表达式示例。
Java 8 Lambda表达式语法
Java Lambda表达式语法
(argument-list) -> {body}
Java lambda表达式包含三个组件。
- 参数列表:也可以为空或非空。
- 箭头标记:用于链接参数列表和表达式主体。
- 正文:包含lambda表达式的表达式和语句。
Java Lambda表达式示例
1. Java简单Lambda表达式示例
在这里,我们使用lambda表达式实现Drawable功能接口方法:
interface Drawable{
public void draw();
}
public class LambdaExpressionExample {
public static void main(String[] args) {
int width=10;
//with lambda
Drawable withLambda=()->{
System.out.println("Drawing "+width);
};
withLambda.draw();
}
}
输出:
Drawing 10
2. Java Lambda表达式示例:无参数
请参考代码中的注释,该注释指示具有Lambda表达式和不具有Lambda表达式的代码。
interface Sayable {
public String say();
}
public class JLEExampleNoParameter {
public static void main(String[] args) {
// without lambda expression
Sayable sayable = new Sayable() {
@Override
public String say() {
return "Return something ..";
}
};
sayable.say();
// with lambda expression
Sayable withLambda = () -> {
return "Return something ..";
};
withLambda.say();
}
}
3. Java Lambda表达式示例:单参数
请参考代码中的注释,该注释指示具有Lambda表达式和不具有Lambda表达式的代码。
interface Printable {
void print(String msg);
}
public class JLEExampleSingleParameter {
public static void main(String[] args) {
// without lambda expression
Printable printable = new Printable() {
@Override
public void print(String msg) {
System.out.println(msg);
}
};
printable.print(" Print message to console....");
// with lambda expression
Printable withLambda = (msg) -> System.out.println(msg);
withLambda.print(" Print message to console....");
}
}
输出:
Print message to console....
Print message to console....
4. Java Lambda表达式示例:多个参数
请参考代码中的注释,该注释指示具有Lambda表达式和不具有Lambda表达式的代码。
interface Addable{
int add(int a,int b);
}
public class JLEExampleMultipleParameters {
public static void main(String[] args) {
// without lambda expression
Addable addable = new Addable() {
@Override
public int add(int a, int b) {
return a + b;
}
};
addable.add(10, 20);
// with lambda expression
// Multiple parameters in lambda expression
Addable withLambda = (a,b)->(a+b);
System.out.println(withLambda.add(10,20));
// Multiple parameters with data type in lambda expression
Addable withLambdaD = (int a,int b) -> (a+b);
System.out.println(withLambdaD.add(100,200));
}
}
5. Java Lambda表达式示例:多个语句
interface IAvarage{
double avg(int[] array);
}
public class JLEExampleMultipleStatements {
public static void main(String[] args) {
// without lambda expression, IAvarage implementation using anonymous class
IAvarage avarage = new IAvarage() {
@Override
public double avg(int[] array) {
double sum = 0;
int arraySize = array.length;
System.out.println("arraySize : " + arraySize);
for (int i = 0; i < array.length; i++) {
sum = sum + array[i];
}
System.out.println("sum : " + sum);
return (sum/ arraySize);
}
};
int[] array = {1,4,6,8,9};
System.out.println(avarage.avg(array));
// with a lambda expression
// You can pass multiple statements in lambda expression
IAvarage withLambda = (withLambdaArray) -> {
double sum = 0;
int arraySize = withLambdaArray.length;
System.out.println("arraySize : " + arraySize);
for (int i = 0; i < withLambdaArray.length; i++) {
sum = sum + withLambdaArray[i];
}
System.out.println("sum : " + sum);
return (sum/ arraySize);
};
int[] withLambdaArray = {1,4,6,8,9};
System.out.println(withLambda.avg(withLambdaArray));
}
}
6. Java Lambda表达式示例:创建线程
public class JLEExampleRunnable {
public static void main(String[] args) {
//without lambda, Runnable implementation using anonymous class
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println(" Runnable example without lambda exp.");
}
};
Thread thread = new Thread(runnable);
thread.start();
//with lambda
Runnable withLambda = () -> System.out.println(" Runnable example with lambda exp.");
Thread thread1 = new Thread(withLambda);
thread1.start();
}
}
输出:
Runnable example without lambda exp.
Runnable example with lambda exp.
7. Java Lambda表达式示例:比较器
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class JLEComparatorExample {
public static void main(String[] args) {
List<Person> listOfPerson = new ArrayList<Person>();
listOfPerson.add(new Person("abc", 27));
listOfPerson.add(new Person("mno", 26));
listOfPerson.add(new Person("pqr", 28));
listOfPerson.add(new Person("xyz", 27));
// Without lambda expression.
// Sort list by age
Comparator<Person> comparator = new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
return o1.getAge() - o2.getAge();
}
};
Collections.sort(listOfPerson, comparator);
System.out.println(" sort persons by age in ascending order");
for (Person person : listOfPerson) {
System.out.println(" Person name : " + person.getName());
}
// Witht lambda expression.
// Sort list by age
Collections.sort(listOfPerson, (Person o1, Person o2) -> {
return o1.getAge() - o2.getAge();
});
// Use forEach method added in java 8
System.out.println(" sort persons by age in ascending order");
listOfPerson.forEach(
(person) -> System.out.println(" Person name : " + person.getName()));
}
}
class Person {
private String name;
private int age;
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
8. Java Lambda表达式示例:事件监听器
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;
public class LambdaEventListenerExample {
public static void main(String[] args) {
JTextField tf=new JTextField();
tf.setBounds(50, 50,150,20);
JButton b=new JButton("click");
b.setBounds(80,100,70,30);
// lambda expression implementing here.
b.addActionListener(e-> {tf.setText("hello swing");});
JFrame f=new JFrame();
f.add(tf);f.add(b);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setLayout(null);
f.setSize(300, 200);
f.setVisible(true);
}
}
9.使用forEach()方法和Lambda表达式示例迭代ArrayList
package net.javaguides.collections;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
/**
*
* Java program to demonstrate different ways to Iterate over an ArrayList in Java
* @author Ramesh Fadatare
*
*/
public class DifferentWaysListIterateProgram {
public static void main(String...args) {
List < String > courses = Arrays.asList("C", "C++", "Core Java", "J2EE", "Spring", "Hibernate", "Python");
// JDK 8 streaming example lambda expression
courses.stream().forEach(course - > printCourse(course));
// JDK 8 streaming example method reference
courses.stream().forEach(DifferentWaysListIterateProgram::printCourse);
// JDK 8 for each with lambda
courses.forEach(course - > printCourse(course));
// JDK 8 for each
courses.forEach(DifferentWaysListIterateProgram::printCourse);
}
// common method to print course
private static void printCourse(String course) {
System.out.println("course name :: " + course);
}
}
10.使用forEach()方法和Lambda表达式示例迭代HashSet
package net.javaguides.collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
/**
* Java program to demonstrate different ways to iterate over a Set in Java
*
* @author Ramesh Fadatare
*
*/
public class DifferentWaysSetIterateProgram {
public static void main(String...args) {
Set < String > courses = new HashSet < String > ();
courses.add("Java");
courses.add("C");
courses.add("C++");
courses.add("Python");
courses.add("Scala");
// JDK 8 streaming example lambda expression
courses.stream().forEach(course - > coursePrinter(course));
// JDK 8 streaming example method reference
courses.stream().forEach(DifferentWaysSetIterateProgram::coursePrinter);
// JDK 8 for each with lambda
courses.forEach(course - > coursePrinter(course));
// JDK 8 for each
courses.forEach(DifferentWaysSetIterateProgram::coursePrinter);
}
// common method to print course
private static void coursePrinter(String course) {
System.out.println("course name :: " + course);
}
}
11.使用forEach()方法和Lambda表达式示例迭代HashMap
package net.javaguides.collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
/**
* This program demonstrate different ways to iterate over a Map in Java
*
* @author Ramesh Fadatare
*
*/
public class DifferentWaysMapIterateProgram {
public static void main(String...args) {
Map < Integer, String > coursesMap = new HashMap < Integer, String > ();
coursesMap.put(1, "C");
coursesMap.put(2, "C++");
coursesMap.put(3, "Java");
coursesMap.put(4, "J2EE");
coursesMap.put(5, "Python");
coursesMap.put(6, "Scala");
// JDK 8 for each with lambda
coursesMap.forEach((k, v) - > coursePrinter(k, v));
// JDK 8 for each method reference
coursesMap.forEach(DifferentWaysMapIterateProgram::coursePrinter);
}
// common method to print map key value
private static void coursePrinter(Integer number, String brand) {
System.out.println("course no : " + number + " and course name : " + brand);
}
}