Lambda和stream流

Lambda表达式

Lambda 表达式是 Java1.8 增加的特性,它为函数式接口服务,所以在学 Lambda 表达式之前,首先要弄清楚什么是函数式接口

函数式接口的特征

  1. 函数式接口被 @FunctionalInterface注解所修饰,向 Java 表示这是一个函数式接口

  1. 接口内有且只能有一个尚未完成的缺省属性为 public abstract 修饰的方法,在 Java1.8 中,接口内被 default 关键字修饰的方法可以有方法体。

Lambda表达式的格式

(方法参数)-> { 方法体 }

当参数为一个的时候可以省略小括号,当方法体为一行代码时,大括号可以省略

函数式接口中的方法可以分为四种:

  1. 无参无返回值

() -> {方法体}               //小括号不可以省略
  1. 有参无返回值(消费者)

(参数列表) -> {方法体}        //参数为一个的时候可以省略小括号
  1. 无参有返回值(生产者)

() -> {方法体}               //方法体内必须要有return语句
  1. ☆有参有返回值

(参数列表) -> {方法体}       //参数为一个的时候可以省略小括号,方法体内必须要有return语句

学习了Lambda表达式,我们在什么场景下使用呢?

//首先声明一个函数式接口
@FunctionalInterface
interface A {
   void run(String str);
}

class Dog {
   void sport(String str ,A a) {
      a.run(str);
    }
}

public static void main(String[] args){

  Dog dog = new Dog();
        dog.sport("今天做什么运动呢?"
        // 这里其实对应了A接口的具体实现类
        , s -> System.out.println(s + " 不如去跑步吧");//Lamvda表达式
        );

}
//输出结果:今天做什么运动呢? 不如去跑步吧
ps:当你遇到接口中只有一个尚未完成的方法时,就可以使用 Lambda 表达式来省略写实现类,能提高代码性能,但缺点是这个实现类一般只能使用一次,如果想要多次用,还是要做实现类,封方法的

Java中常用的接口

@FunctionalInterface
interface Comparator<T> { 
    /**
     * 比较器接口
     *   要求的方法,参数是泛型参数,用户指定类型
     */
    int compare(T o1, T o2);
}
// 过滤器接口,判断器接口,条件接口
@FunctionalInterface
interface Predicate<T> {
    /**
     * 过滤器接口
     *     约束的方法,方法参数是用户使用时约束泛型对应具体数据参数
     */
    boolean test(T t);
}
// 类型转换器接口,做类型之间的转换
@FunctionalInterface
interface Function<T, R> {
    R apply(T t);    
}

Stream流

Stream流是在JDK1.8版本以及之后版本所支持的对集合或数组进行操作的工具,对数组分割排序等操作都肥肠方便

Stream流常用方法

Stream<T> skip(long n);
    限制跳过当前 Stream 流对应元素的个数,【掐头】

Stream<T> limit(long n);
    限制当前 Stream 对应的元素总个数,【去尾】

Stream<T> sorted();  
    对当前 Stream 流存储的进行排序操作
    ,要求元素有自然顺序或者遵从 Comparable 接口,默认【升序】

Stream<T> sorted(Comparator<? super T> com);  重点
    对当前 Stream 流存储的进行排序操作,排序规则由 Comparator 函数式接口规范

Stream<T> filter(Predicate<? super T> pre);
    判断过滤当前 Stream 流可以保存的数据条件,满足条件保留
    ,不满足条件移除,过滤规则由 Predicate 接口约束

Stream<T> distinct();
    当前 Stream 流中对应的所有元素去重擦操作

Stream<R> map(Function<T, R> fun);
    当前 Stream 存储的数据情况转换为 Function 函数式接口要求的返回值类型
    ,完成类型转换操作。

Stream流的终止方法,在执行这些方法后,Stream流会被直接关闭,等待被JVM回收

long count();
    返回当前 Stream 流对应的数据元素个数,为终止方法。

void forEach(Consumer<? super T> con);
    针对于当前 Stream 存储元素的处置方法,为终止方法。
    
<R, A> R collect(Collector<? super T, A, R> collector);
    Stream 流对应的元素存储内容,转换为用户要求的 集合对象。终止方法
    常用:
       ☆ Collectors.toList() 目标存储集合类型为 List 集合
       ☆ Collectors.toSet()  目标存储集合类型为 Set 集合
        
Object[] toArray();
    Stream 流存储的元素内容转换为 Object 类型数组返回

实例操作

ArrayList<String> list = new ArrayList<>();

        list.add("01211");
        list.add("123");
        list.add("23411");
        list.add("345");
        list.add("4561");
        list.add("567");
        list.add("678222");
        list.add("789");

        System.out.println();
        list.stream()
                .skip(2)
                .limit(6)
                .filter(s -> s.length() > 3)
                .sorted(Comparator.comparing(String::length))
                .forEach(System.out::println);
//结果是
4561
23411
678222

Process finished with exit code 0

如有不足,私信或者评论指正,肥肠感激。🙋

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值