在使用lamdba表达式需要函数式接口的支持 java8已经提供了很多函数式接口
在java.util.function包下
核心四大函数式接口
其他函数式接口
Consumer<T> 消费型接口 void accept<T t> 一个参数 没有返回值
源码
如何使用
结果
Supplier<T> 供给型接口 T get<> 无参数 返回一个结果
源码
如何使用
结果
Function<T,R> 函数式接口 R apply<T t> 一个参数 返回一个结果
源码
如何使用
结果
Predicate<T> 断言型接口 boolean test<T t> 一个参数 返回布尔值
源码
如何使用
结果
1 package com.wf.zhang.java8.function; 2 3 import org.junit.Test; 4 5 import java.util.ArrayList; 6 import java.util.Arrays; 7 import java.util.List; 8 import java.util.function.Consumer; 9 import java.util.function.Function; 10 import java.util.function.Predicate; 11 import java.util.function.Supplier; 12 13 public class TestFunction { 14 15 /*** 16 * 测试使用Consumer<T> 17 * 18 * 19 * Consumer<T> 消费型接口 void accept<T t> 一个参数 没有返回值 20 * 21 * test01 模拟消费的过程 22 */ 23 @Test 24 public void test01() { 25 shopping(10000, (m) -> System.out.println("买个大House,消费了" + m + "元")); 26 } 27 28 //定义方法 将Consumer<T> 接口 作为参数 29 public void shopping(double money, Consumer<Double> con) { 30 //Consumer<T> 消费型接口 void accept<T t> 一个参数 没有返回值 31 con.accept(money); 32 } 33 34 35 36 37 /*** 38 * 测试使用Supplier<T> 39 * 40 * Supplier<T> 供给型接口 T get<> 无参数 返回一个结果 41 * 42 * test02 模拟随机产生10个随机数 43 */ 44 @Test 45 public void test02() { 46 47 List<Integer> resultList = getNumList(10, () -> (int) (Math.random() * 100)); 48 49 for (Integer rs : resultList) { 50 System.out.println(rs); 51 } 52 53 } 54 55 //定义方法 将Supplier<T> 作为参数 56 public List<Integer> getNumList(int num, Supplier<Integer> sup) { 57 List<Integer> list = new ArrayList<>(); 58 for (int i = 0; i < num; i++) { 59 // Supplier<T> 供给型接口 T get<> 无参数 返回一个结果 60 Integer n = sup.get(); 61 list.add(n); 62 } 63 return list; 64 } 65 66 67 68 69 /*** 70 * 测试使用Function<T,R> 71 * 72 * Function<T,R> 函数式接口 R apply<T t> 一个参数 返回一个结果 73 * 74 * test03 模拟对字符串的操作 75 */ 76 @Test 77 public void test03() { 78 String s1 = strHandler("abdcef", (s) -> String.valueOf(s.length())); 79 String s2 = strHandler(" 你好 ", (s) -> s.trim()); 80 String s3 = strHandler("abdcef", (s) -> s.toUpperCase()); 81 String s4 = strHandler("ffkkkttt", (s) -> s.toUpperCase().substring(2, 5)); 82 System.out.println(s1); 83 System.out.println(s2); 84 System.out.println(s3); 85 System.out.println(s4); 86 } 87 88 89 //定义方法 将Function<T,R> 作为参数 90 public String strHandler(String str, Function<String, String> fun) { 91 //Function<T,R> 函数式接口 R apply<T t> 一个参数 返回一个结果 92 return fun.apply(str); 93 } 94 95 96 97 98 /*** 99 * 测试使用Predicate<T> 100 * 101 * Predicate<T> 断言型接口 boolean test<T t> 一个参数 返回布尔值 102 * 103 * test04 模拟得到长度大于3的字符串 104 */ 105 @Test 106 public void test04() { 107 108 List<String> newList = Arrays.asList("ADCtttt", "as", "adf", "mkjn"); 109 110 List<String> filterStr = filterStr(newList, (str) -> str.length() > 3); 111 for (String str : filterStr) { 112 System.out.println(str); 113 } 114 } 115 116 //定义方法 将Predicate<T> 断言型接口 作为参数 117 public List<String> filterStr(List<String> list, Predicate<String> pre) { 118 List<String> sList = new ArrayList<>(); 119 for (String s : list) { 120 //Predicate<T> 断言型接口 boolean test<T t> 一个参数 返回布尔值 121 if (pre.test(s)) { 122 sList.add(s); 123 } 124 } 125 return sList; 126 } 127 128 129 }