java8新特性_Lambda表达式和函数式接口_函数式接口
1.Lambda表达式
2.函数式接口
3.方法引用与构造器引用
4.StreamAPI
5.Optional类

1.Lambda表达式

    @Test
public void test1(){
//lambda表达式作为接口的实例
//参数类型可以省略,如果一个参数的时候可以省略括号
//
Runnable r1 = new Runnable() {
@Override
public void run() {
System.out.println("1");
}
};
r1.run();

Runnable r2 = () -> System.out.println("2");
r2.run();
}
@Test
public void test2(){
Comparator com1 = new Comparator() {
@Override
public int compare(Integer o1, Integer o2) {
return Integer.compare(o1,o2);
}
};
int compare = com1.compare(11, 23);
System.out.println(compare);

Comparator com2 = (o1, o2) -> Integer.compare(o1, o2);
int compare1 = com2.compare(22, 11);
System.out.println(compare1);

Comparator com3 = Integer::compareTo;
System.out.println(com3.compare( 44 ,11));
}

表达式的6种方法

1.无参无返回值
2.一个参数,无返回值
3.数据类型可以省略
4.若只有一个参数的话,括号可以省略
5.需要多个参数,可以有返回值,没有大括号的时候
6.有大括号的时候

    @Test
public void test3(){
//1.无参数,无返回值
Runnable r1 = () -> System.out.println("1");
//2,一个参数,无返回值
Consumer c1 = (String str) -> System.out.println(str);
c1.accept("1111");

//3.数据类型可以省略,称为类型推断
Consumer c2 = (str) -> {
System.out.println(str);
};
c2.accept("123");
//4.若只需要一个参数的话那么参数的小括号可以省略
Consumer c3 = str -> System.out.println(str);
c3.accept("456");
//5.需要多个参数,可以有返回值,没有大括号的时候
Comparator com1 = (o1, o2) -> o1.compareTo(o2);
int compare = com1.compare(11, 23);
System.out.println(compare);
//6.有大括号的时候。
Comparator com2 = (o1, o2) -> {
System.out.println("1");
System.out.println("2");
return o1.compareTo(o2);
};
System.out.println(com2.compare(11, 2));

Consumer c4 = s -> System.out.println(s);
c4.accept("123");
}

2.函数式接口

函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。

函数式接口可以被隐式转换为 lambda 表达式。

Lambda 表达式和方法引用(实际上也可认为是Lambda表达式)上。

如定义了一个函数式接口如下:

@FunctionalInterface
interface GreetingService
{
void sayMessage(String message);
}

函数式接口可以对现有的函数友好地支持 lambda。

JDK 1.8 之前已有的函数式接口:

java.lang.Runnable
java.util.concurrent.Callable
java.security.PrivilegedAction
java.util.Comparator
java.io.FileFilter
java.nio.file.PathMatcher
java.lang.reflect.InvocationHandler
java.beans.PropertyChangeListener
java.awt.event.ActionListener
javax.swing.event.ChangeListener

JDK 1.8 新增加的函数接口:

java.util.function

ava.util.function 它包含了很多类,用来支持 Java的 函数式编程,该包中的函数式接口有:
java8新特性_Lambda表达式和函数式接口_java_02

函数式接口实例

Predicate 接口是一个函数式接口,它接受一个输入参数 T,返回一个布尔值结果。

该接口包含多种默认方法来将Predicate组合成其他复杂的逻辑(比如:与,或,非)。

该接口用于测试对象是 true 或 false。

我们可以通过以下实例(Java8Tester.java)来了解函数式接口 Predicate 的使用:

Java8Tester.java 文件

import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;

public class Java8Tester {
public static void main(String args[]){
List list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);

// Predicate predicate = n -> true
// n 是一个参数传递到 Predicate 接口的 test 方法
// n 如果存在则 test 方法返回 true

System.out.println("输出所有数据:");

// 传递参数 n
eval(list, n->true);

// Predicate predicate1 = n -> n%2 == 0
// n 是一个参数传递到 Predicate 接口的 test 方法
// 如果 n%2 为 0 test 方法返回 true

System.out.println("输出所有偶数:");
eval(list, n-> n%2 == 0 );

// Predicate predicate2 = n -> n > 3
// n 是一个参数传递到 Predicate 接口的 test 方法
// 如果 n 大于 3 test 方法返回 true

System.out.println("输出大于 3 的所有数字:");
eval(list, n-> n > 3 );
}

public static void eval(List list, Predicate predicate) {
for(Integer n: list) {

if(predicate.test(n)) {
System.out.println(n + " ");
}
}
}
}

执行以上脚本,输出结果为:

$ javac Java8Tester.java 
$ java Java8Tester
输出所有数据:
1
2
3
4
5
6
7
8
9
输出所有偶数:
2
4
6
8
输出大于 3 的所有数字:
4
5
6
7
8
9