java常用函数式接口 /Supplier供给型接口/Consumer消费者接口/Predicate断言型接口/Function函数接口

函数式接口在Java中是指:有且仅有一个抽象方法的接口。

函数式接口,适用于函数式编程场景的接口
而Java中的函数式编程体现就是Lambda,所以函数式接口就是可以适用于Lambda使用的接口。只有确保接口中有且仅有一个抽象方法,Java中的Lambda才能顺利地进行推导。

格式

// 只要确保接口中有且仅有一个抽象方法即可:
修饰符 interface 接口名称 {
public abstract 返回值类型 方法名称(可选参数信息);
// 其他非抽象方法内容
//由于接口当中抽象方法的 public abstract 是可以省略的,所以定义一个函数式接口很简单:
}

常用函数式接口

  • Supplier接口:
  • Consumer接口
  • Predicate接口
  • Function接口

接下来,我们一一介绍:

Supplier供给型接口:

Supplier接口是不需要传入值,返回一个泛型类T

Consumer消费者接口

Consumer接口是传入一个泛型类T,无返回值

Predicate断言型接口

Predicate接口是传入一个泛型类T,返回要一个布尔类型的值

Function函数接口

Function接口是传入一个泛型类T,返回一个泛型类R

最后上代码:

public class LambdaTest {
	
	//Predicate<T> : 断言型接口
	@Test
	public void test4(){
		List<String> list = Arrays.asList("hello", "atguigu", "world", "aaa", "ok");
		
		List<String> newList = filterStr(list, (s) -> s.length() > 3);
		
		newList.forEach(System.out::println);
	}
	
	public List<String> filterStr(List<String> list, Predicate<String> pre){
		List<String> newList = new ArrayList<>();
		
		for (String s : list) {
			if(pre.test(s)){
				newList.add(s);
			}
		}
		
		return newList;
	}
	
	
	//Function<T, R> : 函数型接口
	@Test
	public void test3(){
		String newStr = strHandler("abcdef", (s) -> s.toUpperCase());
		System.out.println(newStr);
	}
	
	//字符串转大写
	public String strHandler(String str, Function<String, String> fun){
		return fun.apply(str);
	}
	
	//Supplier<T> : 供给型接口
	@Test
	public void test2(){
		List<Integer> numList = getNumList(10, () -> (int)(Math.random() * 100));
		
		for (Integer num : numList) {
			System.out.println(num);
		}
	}
	
	//需求:产生指定个数的整数,并放入集合中
	public List<Integer> getNumList(int count, Supplier<Integer> sup){
		List<Integer> list = new ArrayList<>();
		
		for (int i = 0; i < count; i++) {
			Integer n = sup.get();
			list.add(n);
		}
		
		return list;
	}
	
	//Consumer<T> : 消费型接口
	@Test
	public void test1(){
		
		int num = 0;//jdk1.8前,若局部内部类中使用的同级别的局部变量,必须使用 final修饰,jdk1.8,默认使用 final
		
		Consumer<Double> con = new Consumer<Double>() {

			@Override
			public void accept(Double t) {
				System.out.println(num);
			}
		};
		
		
		
		happy(10000, (h) -> System.out.println("明州刷了大宝剑, 消费" + h + "元" + num));
	}
	
	public void happy(double money, Consumer<Double> con){
		con.accept(money);
	}

}

上几个demo:

题目

给定一个数字列表,如何返回一个由每个数的平方构成的列表呢?
例如,给定【1,2,3,4,5】, 应该返回【1,4,9,16,25】。

Leetcode : IO流 / lambda表达式
Diffculty:java8特性

思路分析:

首先要打开流,处理流,结束流

打开流,就是.stream()
打开流之后我们处理list流中的数据要把list中的所有数据进行平方,那我们对数据平方就是,处理流
那打开流之后得到的是一个Stream类,这个类有一个map方法,可以对lit中的每一个数据做你想做的事情。那我们就调用.map()那.map的()中就是写你想做的事情,里面是传入,四个典型的函数式接口中的Function接口
因为我们要对list中的数据做平方,所以要传入一个值,然后对这个值做平方操作,然后操作完再返回给我们。

那接下来就可以写函数值接口的lambda表达式(x) -> // 一顿操作然后返回这个值,就可以写成 .map((x) -> x * x)写到这里就做了个处理流~

.toList()是Collector帮助类Collectors 的方法
在这里插入图片描述
我们首先是要收集数据,那.map完还是一个流,这个流中有一个.collect()方法,就是收集的方法

那collect方法中需要接收一个 Collector接口的实现
然后我们需要一个list方法collect()方法中用来保存我们处理完的数据,那!要么我们就建一个list,放进到()中取,要么我们就利用Collectors 这个帮助类的.toList返回一个list

上demo(写的有点多了)

public class ReturnNumRquare {
	public static void main(String[] args) {
		List<Integer> list = Arrays.asList(1,2,3,4,5);
		
		List<Integer> list2 = list.stream()
			.map((x) -> x * x)
			.collect(Collectors.toList());
		
		list2.forEach(System.out::println);
	}

}

发布了50 篇原创文章 · 获赞 13 · 访问量 2392

猜你喜欢

转载自blog.csdn.net/endless_Y/article/details/105127561
今日推荐