Java Lambda使用示例

乔欣 Java教程 发布时间:2023-02-15 21:50:54 阅读数:6977 1
下文笔者讲述java中Lambda使用示例简介说明,如下所示

Lambda简介

Lambda表达式:
  是JDK 8中定义的一种新的语法

Lambda的功能:
  简化匿名内部类的代码写法

Lambda的语法
	(匿名内部类被重写方法的形参列表) -> {
		重写方法
	}

注意事项:
   Lambda表达式只能简化函数式接口的
    匿名内部类的写法形式

函数式接口简介

 
接口中有且仅有一个抽象方法的形式
通常会在接口上加上一个@FunctionalInterface注解
 标记该接口必须是满足函数式接口
例:

定义一个user类

class user {
    public int age;
    public char sex;
    public double socre;

    public user(int age, char sex, double score) {
        this.age = age;
        this.sex = sex;
        this.score = score;
    }
}

lambda实现list按照年龄排序

 
实现排序的功能
  可直接调用List对象自带的sort方法完成
此时user需先实现Comparator的接口并重写compare方法,这种方式需修改类
下文笔者演示使用Lambda传入一个比较器的方式实现

sort(Comparator<? super E> c) 方法
  可直接传入一个Comparator对象
public class lambdaTry {
    public static void main(String[] args) {
        List<user> userlist = new ArrayList<>();
        userlist.add(new user(19, '猫猫', 98.0));
        userlist.add(new user(18, '狗狗', 95.0));
        userlist.add(new user(20, '牛牛', 96.0));
        userlist.add(new user(17, '小琪', 97.0));

        userlist.sort(new Comparator<user>() {
            @Override
            public int compare(user o1, user o2) {
                return o1.age - o2.age;
            }
        });
    }
}

使用Lambda简化比较器

@FunctionalInterface注解
@FunctionalInterface
public interface Comparator<T> {
	int compare(T o1, T o2);
    ...
}
 
public class lambdaTry {
    public static void main(String[] args) {
        List<user> userlist = new ArrayList<>();
        userlist.add(new user(19, '猫猫', 98.0));
        userlist.add(new user(18, '狗狗', 95.0));
        userlist.add(new user(20, '牛牛', 96.0));
        userlist.add(new user(17, '小琪', 97.0));

        userlist.sort((user o1, user o2) -> {
                return o1.age - o2.age;
        });
    }
}

Lambda简写

public class lambdaTry {
    public static void main(String[] args) {
        List<user> userlist = new ArrayList<>();
        userlist.add(new user(19, '猫猫', 98.0));
        userlist.add(new user(18, '狗狗', 95.0));
        userlist.add(new user(20, '牛牛', 96.0));
        userlist.add(new user(17, '小琪', 97.0));

        userlist.sort((o1, o2) -> o1.age - o2.age);
    }
}

Lambda之List转换为数组

JDK11之后
   提供toArray方法实现list转数组

default <T> T[] toArray(IntFunction<T[]> generator) {
    return toArray(generator.apply(0));
}
IntFunction函数式接口是从JDK8之后实现的
 内部只有一个apply抽象方法,是一个标准的函数式接口

@FunctionalInterface
public interface IntFunction<R> {
    R apply(int value);
}

可直接使用lambda
   完成数组转换
public class lambdaTry {
    public static void main(String[] args) {
        List<user> userlist = new ArrayList<>();
       userlist.add(new user(19, '猫猫', 98.0));
        userlist.add(new user(18, '狗狗', 95.0));
        userlist.add(new user(20, '牛牛', 96.0));
        userlist.add(new user(17, '小琪', 97.0));

		// 原本写法
        // user[] users = userlist.toArray(new IntFunction<user[]>() {
        //     @Override
        //     public user[] apply(int value) {
        //         return new user[value];
        //     }
        // });

        // lambda写法
        user[] users = userlist.toArray(value -> new user[value]);
        
        // 实际上用不上这样的写法,只是为了举例说明
        // user[] users = userlist.toArray(new user[0]);
        // user[] users = userlist.toArray(user[]::new);
        // 上面两种写法都可以,传值进去的size为0不影响实际的转换,具体可以看ArrayList的toArray重写方法
        
    }
}

输出年龄大于18的男同学的成绩

default void forEach(Consumer<? super T> action) {
    Objects.requireNonNull(action);
    for (T t : this) {
        action.accept(t);
    }
}
 Consumer接口,也是一个函数式接口

@FunctionalInterface
public interface Consumer<T> {
    void accept(T t);
    ...
}
public class lambdaTry {
    public static void main(String[] args) {
        List<user> userlist = new ArrayList<>();
		userlist.add(new user(19, '猫猫', 98.0));
        userlist.add(new user(18, '狗狗', 95.0));
        userlist.add(new user(20, '牛牛', 96.0));
        userlist.add(new user(17, '小琪', 97.0));

        // userlist.forEach(new Consumer<>() {
        //     @Override
        //     public void accept(user user) {
        //         if (user.age >= 18 && user.sex == 'g') {
        //             System.out.println(user.score);
        //         }
        //     }
        // });

        userlist.forEach(user -> {
            if (user.age >= 18 && user.sex == 'g') {
                System.out.println(user.score);
            }
        });
    }
}

lambda的另一用途

简写成方法引用(method reference)

方法引用

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

主要分为四种:

 构造器引用 Class::new
   user[] users = userlist.toArray(user[]::new);
 静态方法引用 Class::static_method
     打印每个user(需要在user内重写toString)
 
 userlist.forEach(System.out::println)  
    特定类的任意对象的方法引用 Class::method
    特定对象的方法引用 instance::method 
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaCourse/202302/5804.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者