上一篇Lambda表达式说到,Lambda表达式需要“函数式接口”的支持,那每一次需要用到Lambda表达式,都得写一个接口,这样不就更麻烦了吗?但是,Java8已经为我们内置了一些常用的函数式接口,一般来说,我们是不需要自己定义一个函数式接口的。
内置函数式接口一:
-
Consumer : 消费型接口
void accept(T t);
消费型接口的返回值为void,也就是对参数进行操作,但是无返回值,通俗地说可以理解为
有去无回
。下面看示例:
@Test
public void test() {
spend(1000, (m) -> System.out.println("本次花费:" + m + "元"));
}
public void spend(double money, Consumer<Double> com) {
com.accept(money);
}
内置函数式接口二:
-
Supplier : 供给型接口
T get();
供给型接口简单地说就是给你返回一些对象的。
例如有这样的需求:产生指定个数的整数,并放入集合中
实现代码如下:
@Test
public void test() {
getNumList(10, () -> (int) (Math.random() * 100)).forEach(System.out::println);
}
public List<Integer> getNumList(int num, Supplier<Integer> su) {
List<Integer> list = new ArrayList<>();
for (int i = 0; i < num; i++) {
list.add(su.get());
}
return list;
}
内置函数式接口三:
-
Function<T, R> : 函数型接口
R apply(T t);
在上一篇Lambda表达式文末,我们的示例三里写了一个MyFun的接口,但这里,我们不需要再重新写一个接口,Java8已经内置了Function<T, R> 这样的函数型接口。
下面的代码以Function这个函数型接口实现了跟上一篇示例三相同的操作
@Test
public void test() {
System.out.println(strHandler("abcdefg",(str)-> str.toUpperCase()));
System.out.println(strHandler("\t\t\t\t abcdefg",(str)-> str.trim()));
System.out.println(strHandler("abcdefg",(str)-> str.substring(2, 5)));
}
public String strHandler(String str, Function<String, String> fun) {
return fun.apply(str);
}
内置函数式接口四:
-
Predicate : 断言型接口
boolean test(T t);
Predicate : 断言型接口,我们用于做一些判断操作。
现在,我们有这样的需求:将满足条件的字符串,放入集合中。
这里的条件为
字符串长度大于3
@Test public void test() { List<String> list = Arrays.asList("ABCD","Hello","asd","as","jwhgr"); List<String> filterList = filterStr(list, (s) -> s.length()>3); filterList.forEach(System.out::println); } public List<String> filterStr(List<String> list, Predicate<String> pre){ List<String> listStr = new ArrayList<>(); for (String str : list) { if (pre.test(str)) listStr.add(str); } return listStr; }