JavaSE&Java8 Lambda 表达式

简介: JavaSE&Java8 Lambda 表达式

🍉 Java 8 介绍


Java8是2014年发布的版本,是Java5以来具有革命性的版本。


Java 8的主要新语法特性如下:


  1. Lambda表达式

Lambda表达式使Java程序员能够编写更加简洁、易读和易维护的代码。它是一种匿名函数,可以将其作为参数传递给其他方法或函数。


  1. 方法引用

方法引用是指通过名称来引用现有的方法,从而让代码变得更简洁、易读和易于维护。Java 8中提供了四种不同的方法引用方式:静态方法引用、实例方法引用、构造器引用和超类方法引用。


  1. 接口默认方法

Java 8允许在接口中定义具体实现的默认方法,这样实现类就可以继承该方法的实现,避免了因为新增方法而导致向所有实现类迁移代码的麻烦。


  1. 函数式接口

函数式接口仅包含一个抽象方法的接口,它是Java 8中Lambda表达式的基础。Java 8中提供了许多常用的函数式接口,例如:Predicate、Function、Consumer等。


  1. Stream API

Stream API是Java 8中一个强大的工具,它允许程序员轻松处理集合数据。使用流API可以实现筛选、排序、映射、归约等操作,让代码更加简洁、易读和易于维护。


  1. 时间API

Java 8中引入了新的时间API,它提供了一种更好的方式来处理日期和时间。这个API包含多个类,可以用来处理日历、时间、时区和持续时间等问题。


  1. Optional 类型

Optional类型是一个容器对象,可以包含null或非null值。它为程序员提供一种优雅的方式来处理null检查,从而避免NullPointerException异常。


这些新语法都带来了很大的变化,使得Java编程更加简洁、高效、可读性强和易于维护。


🍉 Lambda 表达式


Lambda是 一个 匿名函数,我们可以把Lambda表达式理解为是 一段可以传递的代码(将代码像数据一样进行传递)。可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格,使Java的语言表达能力得到了提升。


🍅🍅 基础语法


Java8引入了一个新的操作符: ->,该操作符称为箭头操作符或 Lambda 操作符,箭头操作符将Lambda 表达式拆分为2部分:


  1. 左侧:Lambda 表达式的 参数列表
  2. 右侧:Lambda 表达式中 所执行的功能,即 Lambda 体


语法格式1:无参数,无返回值

public class test {
    public static void main(String[] args) {
        Runnable r = new Runnable() {
            @Override
            public void run() {
                System.out.println("Hello World!");
            }
        };
        r.run();

        System.out.println("--------------------------------------");
        Runnable r1 = () -> System.out.println("Hello Lambda");
        r1.run();
    }
}

语法格式2:有一个参数,并且无返回值,小括号可省略不写,:

public class test {
    public static void main(String[] args) {
        Consumer<String> con = x -> System.out.println(x);
        con.accept("SNOW");
    }
}

语法格式3:有2个以上的参数,有返回值,并且Lambda体中有多条语句 ,有返回值

public class test {
    public static void main(String[] args) {
        Comparator<Integer> com = (x,y) -> {
            System.out.println("函数式接口");
            return Integer.compare(x,y);
        };
    }
}

语法格式4:若Lambda体中只有一条语句,return和大括号都可省略不写

public class test {
    public static void main(String[] args) {
        Comparator<Integer> com = (x,y) -> Integer.compare(x,y);
    }
}

语法格式5:Lambda表达式的参数列表的数据类型可以省略不写,因为JVM编译器通过上下文推断出数据类型,即“类型推断”


Lambda表达式需要 函数式接口 的支持!(函数式接口:接口中只有一个抽象方法的接口,称为函数式接口,可以使用 @FunctionalInterface 修饰。)


🍅🍅 案例

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Employee {
    private String name;
    private int age;
    private Double salary;
}
public class test {
    public static void main(String[] args) {
        List<Employee> list = Arrays.asList(
                new Employee("1号", 25, 5000.0),
                new Employee("2号", 35, 3000.0),
                new Employee("3号", 35, 2000.0),
                new Employee("4号", 35, 8000.0),
                new Employee("5号", 65, 1000.0)
        );
        Collections.sort(list,(e1,e2)->{
            if (e1.getAge() == e2.getAge()){
                return e1.getName().compareTo(e2.getName());
            }else {
                // 倒序
                return -Integer.compare(e1.getAge(),e2.getAge());
            }
        });
        Iterator<Employee> iterator = list.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }
    }
}


🍉 函数式接口


🍅🍅 内置的四大核心函数式接口


  • Consumer:消费型接口 void accept(T t);
  • Supplier:供给型接口 T get();
  • Function(T,R):函数型接口 R apply(T t);
  • Predicate:断言型接口 boolean test(T t);


🍅🍅 案例


  1. Consumer:消费型接口
@Test
public void test(){
    this.happy(1000,m -> {
        System.out.println("我消费了"+ m);
    });
}

public void happy(double money, Consumer<Double> con){
    con.accept(money);
}
  1. Supplier:供给型接口
@Test
public void test(){
    List<Integer> numList = this.getNumList(5, () -> (int) (Math.random() * 100));
    for (Integer integer : numList) {
        System.out.println(integer);
    }
}

//产生指定数量的整数
public List<Integer> getNumList(int num, Supplier<Integer> sup){
    List<Integer> list = new ArrayList<>();
    for (int i = 0; i < num; i++) {
        list.add(sup.get());
    }
    return list;
}
  1. Function(T,R):函数型接口
@Test
public void test(){
    System.out.println(this.handler("str", str -> (str + "123")));
}

//处理字符串
public String handler(String str, Function<String,String> fun){
    return fun.apply(str);
}
  1. Predicate:断言型接口
@Test
public void test(){
    List<String> stringList = Arrays.asList("qwe", "123", "hello", "ranhaifeng", "asdasdsaewqewqe");
    List<String> list = filterStr(stringList, s -> (s.length() > 3));
    for (String s : list) {
        System.out.println(s);
    }
}

//将满足条件的字符串放入集合
public List<String> filterStr(List<String> list, Predicate<String> pre){
    List<String> stringList = new ArrayList<>();
    for (String s : list) {
        if (pre.test(s)){
            stringList.add(s);
        }
    }
    return stringList;
}
相关文章
|
17天前
|
Java API 开发者
Java中的Lambda表达式与Stream API的协同作用
在本文中,我们将探讨Java 8引入的Lambda表达式和Stream API如何改变我们处理集合和数组的方式。Lambda表达式提供了一种简洁的方法来表达代码块,而Stream API则允许我们对数据流进行高级操作,如过滤、映射和归约。通过结合使用这两种技术,我们可以以声明式的方式编写更简洁、更易于理解和维护的代码。本文将介绍Lambda表达式和Stream API的基本概念,并通过示例展示它们在实际项目中的应用。
|
19天前
|
Java API 开发者
Java中的Lambda表达式:简洁代码的利器####
本文探讨了Java中Lambda表达式的概念、用途及其在简化代码和提高开发效率方面的显著作用。通过具体实例,展示了Lambda表达式如何在Java 8及更高版本中替代传统的匿名内部类,使代码更加简洁易读。文章还简要介绍了Lambda表达式的语法和常见用法,帮助开发者更好地理解和应用这一强大的工具。 ####
|
21天前
|
并行计算 Java 编译器
深入理解Java中的Lambda表达式
在Java 8中引入的Lambda表达式,不仅简化了代码编写,还提升了代码可读性。本文将带你探索Lambda表达式背后的逻辑与原理,通过实例展示如何高效利用这一特性优化你的程序。
|
26天前
|
搜索推荐 Java API
探索Java中的Lambda表达式
本文将深入探讨Java 8引入的Lambda表达式,这一特性极大地简化了代码编写,提高了程序的可读性。通过实例分析,我们将了解Lambda表达式的基本概念、使用场景以及如何优雅地重构传统代码。文章不仅适合初学者,也能帮助有经验的开发者加深对Lambda表达式的理解。
|
16天前
|
安全 Java API
Java中的Lambda表达式:简化代码的现代魔法
在Java 8的发布中,Lambda表达式的引入无疑是一场编程范式的革命。它不仅让代码变得更加简洁,还使得函数式编程在Java中成为可能。本文将深入探讨Lambda表达式如何改变我们编写和维护Java代码的方式,以及它是如何提升我们编码效率的。
|
19天前
|
安全 Java API
Java中的Lambda表达式与Stream API的高效结合####
探索Java编程中Lambda表达式与Stream API如何携手并进,提升数据处理效率,实现代码简洁性与功能性的双重飞跃。 ####
24 0
|
26天前
|
Java 开发者
探索Java中的Lambda表达式
【10月更文挑战第43天】本文将深入浅出地介绍Java中的Lambda表达式,通过实际代码示例,带领读者理解其背后的原理及应用场景。Lambda表达式不仅简化了代码,还提高了开发效率,是Java开发者必备的技能之一。
|
Java
QuartZ Cron表达式在java定时框架中的应用
CronTrigger CronTriggers往往比SimpleTrigger更有用,如果您需要基于日历的概念,而非SimpleTrigger完全指定的时间间隔,复发的发射工作的时间表。 CronTrigger,你可以指定触发的时间表如“每星期五中午”,或“每个工作日9:30时”,甚至“每5分钟一班9:00和10:00逢星期一上午,星期三星期五“。
1104 0
|
3天前
|
安全 Java API
java如何请求接口然后终止某个线程
通过本文的介绍,您应该能够理解如何在Java中请求接口并根据返回结果终止某个线程。合理使用标志位或 `interrupt`方法可以确保线程的安全终止,而处理好网络请求中的各种异常情况,可以提高程序的稳定性和可靠性。
29 6
|
18天前
|
设计模式 Java 开发者
Java多线程编程的陷阱与解决方案####
本文深入探讨了Java多线程编程中常见的问题及其解决策略。通过分析竞态条件、死锁、活锁等典型场景,并结合代码示例和实用技巧,帮助开发者有效避免这些陷阱,提升并发程序的稳定性和性能。 ####