java学习笔记-函数式接口-Stream流

一、函数式接口

1.1、函数式接口

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

@FunctionalInterface
public interface Demo {
    
    
	void show();
}

@FunctionalInterface放在接口定义的上方:如果接口是函数式接口,编译通过;如果不是,编译失败

如果方法的参数是一个函数式接口,我们可以使用Lambda表达式作为参数传递

start(() -> System.out.println("1"));

如果方法的返回值是一个函数式接口,我们可以使用Lambda表达式作为结果返回

private static Comparator<String> getcomparator(){
    
    
		return (s1,s2) -> s1.length() - s2.length();	
}

1.2、常用的函数式接口

1、Supplier接口
Supplier:包含一个无参的方法
T get():获得结果
该方法不需要参数,它会按照某种实现逻辑(由Lambda表达式实现)返回一个数据
Supplier接口也被称为生产型接口,如果我们指定了接口的泛型是什么类型,那么接口中的get方法就会生产什么类型的数据供我们使用。
2、Consumer接口
Consumer:包含两个方法
void accept(T t):对给定的参数执行此操作
default ConsumerandThen(Consumer after):返回一个组合的Consumer,依次执行此操作,然后执行after
Consumer接口也被称为消费型接口,它消费的数据的数据类型由泛型指定
3、Predicate接口
Predicate:常用的四个方法
boolean test(T t):对给定的参数进行判断(判断逻辑Lambda表达式实现),返回一个布尔值
default Predicatenegate():返回一个逻辑的否对,对应逻辑非
default Predicateand(Predicate other):返回一个组合判断,对应短路与
default Predicateor(Predicate other):返回一个组合判断,对应短路或
Predicate接口通常用于判断参数是否满足指定的条件
4、Function接口
Function<T,R>:常用的两个方法
R apply(T t):将此函数应用于给定的参数
default Function andThen(Function after):返回一个组合函数,首先将该函数应用于输入,然后将after函数应用于结果
Function<T,R>接口通常用于对参数进行处理,转换(处理逻辑由Lambda表达式实现),然后返回一个新的值

二、Stream流

2.1、Stream流的生产方法

生成流:
通过数据源(集合,数组等)生成流

list.stream();

中间操作:
一个流后面可以跟随零个或多个中间操作,其目的主要是打开流,做出某种程度的数据过滤/映射,然后返回一个新的流,交给下一个操作使用

filter();

终结操作:
一个流只能有一个终结操作,当这个操作执行后,流就被使用“光”了,无法在被操作。所以这必定是流的最后一个操作

forEach();

Stream流的常见生成方式
Collection体系的集合可以使用默认方法stream()生成流

List<String> list = new ArrayList<String>();
Stream<String> ls = list.stream();
	
Set<String> set = new HashSet<String>();	
Stream<String> ss = set.stream();

default Stream< E>stream()
Map体系的集合间接的生成流

Map<String,Integer> map = new HashMap<String,Integer>();
Stream<String> s = map.keySet().stream();
Stream<Integer> i = map.values().stream();
Stream<Map.Entry<String, Integer>> en = map.entrySet().stream();

数组可以通过Stream接口的静态方法of(T…values)生成流

String[] st = {
    
    "hello","java","world"};
Stream<String> sts = Stream.of(st);

2.2、Stream流的常见中间操作方法

1、filter
Streamfilter(Predicate predicate):用于对流中的数据进行过滤
Predicae接口中的方法 boolean test(T t):对给定的参数进行判断,返回一个布尔值
2、limit skip
Streamlimit(long maxSize):返回此流中的元素组成的流,截取前指定参数个数的数据
Streamskip(long n):跳过指定参数个数的数据,返回由该流的剩余元素组成的流
3、concat distinct
staticStreamconcat(Stream a, Stream b):合并a和b两个流为一个流
Streamdistinct():返回由该流的不同元素(根据Object.equals(Object))组成的流
4、sorted
Streamsorted():返回由此流的元素组成的流,根据自然顺序排序
Streamsorted(Comparator comparator):返回由该流的元素组成的流,根据提供的Comparator进行排序
5、map mapToInt
Streammap(Function mapper):返回由给定函数应用于此流的元素的结果组成的流
Function接口中的方法 R apply(T t)
IntStream mapToInt(ToIntFunction mapper):返回一个IntStream其中包含将给定函数应用于此流的元素的结果
IntStream:表示原始int流
ToIntFunction接口中的方法 int applyAsInt(T value)

2.3、Stream流的常见终结操作方法

void forEach(Consumer action):对此流的每个元素执行操作
Consumer接口中的方法 void accept(T t):对给定的参数执行此操作
long count():返回此流中的元素数

2.4、Stream流的收集操作

R collect(Collector collector)
但是这个收集方法的参数是一个Collector接口
工具类Collectors提供了具体的收集方式
public staticCollector toList():把元素收集到List集合中
public staticCollector toSet():把元素收集到Set集合中
public static Collector toMap(Function keyMapper,Function valueMapper):把元素收集到Map集合中

猜你喜欢

转载自blog.csdn.net/weixin_45573296/article/details/123171986