Java8新特性Lambda表达式怎么应用

发布时间:2023-04-18 11:13:04 作者:iii
来源:亿速云 阅读:87

这篇文章主要介绍“Java8新特性Lambda表达式怎么应用”,在日常操作中,相信很多人在Java8新特性Lambda表达式怎么应用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java8新特性Lambda表达式怎么应用”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

一、简介

Java 8 (又称为 jdk 1.8) 是 Java 语言开发的一个主要版本。 Oracle 公司于 2014 年 3 月 18 日发布 Java 8 ,它支持函数式编程,新的 JavaScript 引擎,新的日期 API,新的Stream API 等。

 特征

 注意:Lambda表达式适用于只有一个抽象方法的接口!!

引入

自定义接口

interface Fu{
    void add();
}

使用匿名内部类实现接口

Fu fu = new Fu() {
            @Override
            public void add() {
                System.out.println("我是add方法");
            }
        };
        fu.add();

使用Lambda表达式实现接口

        Fu fu1 = ()->{
            System.out.println("我是add1方法");
        };
        fu1.add();

Lambda表达式的总结

三、Lambda表达式的使用

无参、无返回值

接口

interface F{
    void add();
}

测试

        //无参无返回值
        F f = ()->{
            System.out.println("我是add方法");
        };
        f.add();

有参无返回值

接口

interface F{
    void add(int a);
}

测试

        F f = (int a)->{
            System.out.println("a="+a);
        };
        f.add(12);

无参数有返回值

接口

interface F{
    int add();
}

测试

        F f = ()->{
            return 12;
        };
        int i = f.add();
        System.out.println(i);

有参数有返回值

接口

interface F{
    int add(int a);
}

测试

        F f = (int a)->{
            return 12+a;
        };
        int i = f.add( 12 );
        System.out.println(i);

四、Lambda表达式的注意事项

 五、函数式接口

函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,可以有其他普通方法,用@FunctionalInterface检验是否是函数式接口。

@FunctionalInterface
interface F1{
    void t1();
    
    default void t2(){//不计
        
    }
    static void t3(){//不计
        
    }
    public boolean equals(Object object);//不计
}

作用:在Java中主要用在Lambda表达式和方法引用。

内置函数式接口

函数式接口使用场景

消费型接口

//函数式接口的使用场景
public class Test03 {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        Collections.addAll(list,1,2,3,6,5,4,8,9);
        //匿名内部类
        Consumer<Integer> con = new Consumer<Integer>() {
            @Override
            public void accept(Integer integer) {
                //参数代表集合中的每一个数据
                System.out.print(integer+" ");
            }
        };
        list.forEach( con );
        System.out.println();
        System.out.println("==================");
        //Lambda表达式1
        Consumer cons = (y)->{
            System.out.print(y+" ");
        };
        list.forEach( cons );
        System.out.println();
        System.out.println("==================");
        //Lambda表达式2
        list.forEach( y-> System.out.print(y+" ") );
    }
}

断言型接口

public class Test04 {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        Collections.addAll(list,1,2,3,6,5,4,8,9);
        //匿名内部类
        Predicate<Integer> predicate = new Predicate<Integer>() {
            @Override
            public boolean test(Integer integer) {
                //参数o代表集合中的每一个数
                if (integer<=6){
                    return true;//删除该数据
                }
                return false;//不删除该数据
            }
        };
        list.removeIf(predicate);
        list.forEach( x-> System.out.println(x) );
        System.out.println("=================");
 
        //Lambda表达式
        list.removeIf( y->{
            if (y<=6){
                return true;
            }
            return false;
        } );
        list.removeIf(predicate);
        list.forEach( x-> System.out.println(x) );
        System.out.println("=================");
    }
}

六、方法调用

方法引用通过方法的名字来指向一个方法。方法引用可以使语言的构造更紧凑简洁,减少冗余代码。方法引用使用一对冒号 :: 。

//方法引用
public class Test05 {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        Collections.addAll(list,4,8,9);
 
        //使用Lambda表达式
        list.forEach( x-> System.out.println(x) );
        System.out.println("==================");
        //方法引用
        //使用场景,参数传递过来不做任何处理,直接输出的就可以使用方法引用
        list.forEach(System.out::println);
    }
}

构造器引用:它的语法是Class::new,或者更一般的Class< T >::new

final Car car = Car.create( Car::new ); final List< Car > cars = Arrays.asList( car );

静态方法引用:它的语法是Class::static_method

cars.forEach( Car::collide );

特定类的任意对象的方法引用:它的语法是Class::method

cars.forEach( Car::repair );

特定对象的方法引用:它的语法是instance::method

final Car police = Car.create( Car::new ); cars.forEach( police::follow );

七、Stream流式编程

什么是 Stream?

Stream(流)是一个来自数据源的元素队列并支持聚合操作

和以前的Collection操作不同, Stream操作还有两个基础的特征:

 使用 Stream流的步骤

 排序去重

//Stream 流式编程
public class StreamTest01 {
    public static void main(String[] args) {
        //需求:有一堆数据,且有重复值,要求有序去除重复值
        List<Integer> list = new ArrayList<>();
        Collections.addAll(list,56,89,75,64,24,25,24,89,56,75);
 
        //流式编程处理
        //获取stream
        Stream<Integer> stream = list.stream();
        //中间操作
        stream = stream.distinct()//去重操作
                        .sorted();//排序
        //终止操作
        stream.forEach( x->{//输出集合中元素
            System.out.println(x);
        } );
    }
}

中间操作

        stream = stream.distinct()//去重操作
                        .sorted();//排序
        .limit( 4 );//取前四个元素
        .skip( 2 );//跳过前几个元素
        .map( x->x+4 );//每一个元素加上特定的值
        .filter( x->{//过滤操作,true正常返回,false不返回
            if (x>=25){
                return true;
            }
            return false;
        } );

八、串行流和并行流

串行流

        Stream<Integer> stream = list.stream();//串行流

并行流

        Stream<Integer> stream1 = list.parallelStream();//并行流

九、Optional 类

  Optional 类的方法

到此,关于“Java8新特性Lambda表达式怎么应用”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!

推荐阅读:
  1. Java中动态代理和反射机制的案例分析
  2. java中Path和ClassPath有哪些区别

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

java lambda

上一篇:PHP curl、get、post请求怎么封装函数

下一篇:Android事件分发机制是什么

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》