Lambda表达式,是JDK8的新特性。
package com.edu.jdk8;
import java.util.function.Consumer;
import org.junit.Test;
/**
* JDK8的新特性:Lambda表达式
*/
public class LambdaTest {
@Test
public void test02() {
Consumer<String> con1 = new Consumer<String>() {//java.util.function.Consumer;
@Override
public void accept(String t) {
System.out.println(t);
}
};
con1.accept("hello world!");
System.out.println("---------------------");
Consumer<String> con2 = (String t) -> System.out.println(t);
con2.accept("hello world.....");
System.out.println("--------------------");
Consumer<String> con3 = (t) -> System.out.println(t);
con3.accept("haha");
}
@Test
public void test01() {
Runnable r1 = new Runnable() {
@Override
public void run() {
System.out.println("hello world!");
}
};
r1.run();
System.out.println("---------------------");
Runnable r2 = () -> System.out.println("hello world!");
r2.run();
}
}
使用Lambda表达式的前提条件
package com.edu.jdk8;
import java.util.Comparator;
import java.util.function.BinaryOperator;
import java.util.function.Consumer;
import org.junit.Test;
/**
* 要想使用Lambda表达式,前提条件是:
* 1、被实现化对象一定要接口
* 2、该接口只有一个抽象方法
*
* 在接口上可以使用@FunctionalInterface函数式接口的注解来定义,
* 其作用是为了在编码阶段进行验证
*
* Lambda表达的几种方式:
*
*/
public class LambdaTest02 {
// 语法格式一:无参,无返回值,Lambda 体只需一条语句
@Test
public void test01() {
Runnable r1 = new Runnable() {
@Override
public void run() {
System.out.println("runnable.....");
}
};
r1.run();
System.out.println("---------------");
Runnable r2 = () -> System.out.println("runnable.....");
r2.run();
}
// 语法格式二:Lambda 需要一个参数,且无返回值
@Test
public void test02() {
Consumer<String> con1 = new Consumer<String>() {
@Override
public void accept(String t) {
System.out.println(t);
}
};
con1.accept("hello world!");
System.out.println("---------------------");
// 类型推断
Consumer<String> con2 = (String t) -> System.out.println(t);
con2.accept("hello world.....");
System.out.println("--------------------");
Consumer<String> con3 = (t) -> System.out.println(t);
con3.accept("haha");
}
// 语法格式三:Lambda 只需要一个参数时,参数的小括号可以省略
@Test
public void test03() {
Consumer<String> con1 = new Consumer<String>() {
@Override
public void accept(String t) {
System.out.println(t);
}
};
con1.accept("Consumer......");
System.out.println("---------------------");
Consumer<String> con2 = (t) -> System.out.println(t);
con2.accept("Consumer......");
System.out.println("---------------------");
Consumer<String> con3 = t -> System.out.println(t);
con3.accept("Consumer.....t...");
}
// 语法格式四:Lambda 需要两个参数,并且有返回值
@Test
public void test04() {
BinaryOperator<Long> bo = new BinaryOperator<Long>() {
@Override
public Long apply(Long t, Long u) {
return t + u;
}
};
Long val = bo.apply(2L, 5L);
System.out.println(val);
System.out.println("---------------");
BinaryOperator<Long> bo1 = (t, u) -> {return t + u;};
val = bo1.apply(20L, 30L);
System.out.println(val);
}
// 语法格式五:当Lambda 体只有一条语句时,return 与大括号可以省略
@Test
public void test05() {
BinaryOperator<Long> bo = new BinaryOperator<Long>() {
@Override
public Long apply(Long t, Long u) {
return t + u;
}
};
Long val = bo.apply(3L, 7L);
System.out.println(val);
System.out.println("---------------");
BinaryOperator<Long> bo1 = (t, u) -> t + u;
val = bo1.apply(20L, 30L);
System.out.println(val);
}
@Test
public void test06() {
Comparator<Integer> com1 = new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return Integer.compare(o1, o2);
}
};
int v = com1.compare(30, 20);
System.out.println(v);
System.out.println("-----------");
Comparator<Integer> com2 = (o1, o2) -> Integer.compare(o1, o2);
v = com2.compare(5, 8);
System.out.println(v);
}
// 使用自定义函数式接口
@Test
public void test07() {
MyFunctionalInterface mfi = new MyFunctionalInterface() {
@Override
public void show(String s) {
System.out.println(s);
}
};
mfi.show("lambda");
System.out.println("--------------");
MyFunctionalInterface mfi1 = (String s) -> System.out.println(s);
mfi1.show("......");
MyFunctionalInterface mfi2 = (s) -> System.out.println(s);
mfi2.show(".xxxxx");
MyFunctionalInterface mfi3 = s -> System.out.println(s);
mfi3.show(".xxxxx");
}
}
自定义函数式接口
package com.jdk8;
/**
* 自定义函数式接口
* @title MyFunctionalInterface.java
*/
@FunctionalInterface
public interface MyFunctionalInterface {
void show(String s);
}