Java8的lambda无介绍快使用

导读:本篇文章讲解 Java8的lambda无介绍快使用,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

问题背景

java8之前方法只能存在于对象中,现在可以使用lambda表达式解决这个问题,可以减少代码量,提高效率,增加可读性

lambda的使用

1 先了解几个特点

  • lambda表达式是一个匿名的函数,方法可以当做参数一样进行传递
  • lambda表达式通常使用 (argument) -> {body},也就是(参数)->(函数体)
  • 无参数,无返回值,lambda 体中只有一行代码时,{}可以忽略:( ) -> System.out.println ( “Hello World” );
  • 无参数,有返回值:() -> { return 3.1415 };
  • 有参数,无返回值:(String s) -> { System.out.println(s); }
  • 有一个参数,无返回值:s -> { System.out.println(s); }
  • 有多个参数,有返回值:(int a, int b) -> { return a + b; }
  • 有多个参数,表达式参数类型可以不写,jvm 可以根据上下文进行类型推断:(a, b) -> { return a – b; }
  • lambda表达式可以具有零个,一个或多个参数
  • 可以显示声明参数的类型,也可以由编译器自动从上下文推断参数的类型。Lambda表达式会帮助我们推断出这个参数的类型。例如(int a,int b)就可以写成(a,b)
  • 参数用小括号括起来,用逗号分隔。例如 (a, b) 、 (int a, int b) 或 (String a, int b, float c)构成
  • 空括号用于表示一组空的参数。例如 () -> 42。
  • 当有且仅有一个参数时,如果不显式指明类型,则不必使用小括号。例如 a -> return a*a
  • Lambda 表达式的正文可以包含零条,一条或多条语句。
  • 如果 Lambda 表达式的正文只有一条语句,则大括号可不用写,且表达式 的返回值类型要与匿名函数的返回类型相同
  • 如果 Lambda 表达式的正文有一条以上的语句必须包含在大括号{}(代码块) 中,且表达式的返回值类型要与匿名函数的返回类型相同
  • Lambda表达式中的正文实现的接口中只能有一个抽象方法。(因为它省略的匿名内部类中的方法名)
  • Lambda中的核心思想就是将接口中的函数当做参数一样进行传递。(在使用Lambda的时候有要求到这个接口中的抽象方法只有一个)

2 lambda示例

import org.junit.Test;

import java.util.Comparator;

/**
 * Lambda表达式的使用举例
 */
public class LambdaTest {
    @Test
    public void test(){
        Runnable r1 = new Runnable() {
            @Override
            public void run() {
                System.out.println("长安欢迎您");
            }
        };
        r1.run();


        //lambda表达式
        Runnable r2 = () -> System.out.println("长安欢迎您");
        r2.run();
    }

    @Test
    public void test2(){
        Comparator<Integer> c1 = new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return Integer.compare(o1,o2);
            }
        };
        int compare1 = c1.compare(8,16);
        System.out.println(compare1);


        //Lambda表达式的写法
        Comparator<Integer> c2 = (o1,o2) -> Integer.compare(o1,o2);
        int compare2 = c2.compare(28,35);
        System.out.println(compare2);

        //方法引用
        Comparator<Integer> c3 = Integer :: compare;
        int compare3 = c3.compare(28,35);
        System.out.println(compare3);
    }
}
import org.junit.Test;

import java.util.Comparator;
import java.util.function.Consumer;

/**
 * Lambda表达式的使用
 *
 * 1.举例: (o1,o2) -> Integer.compare(o1,o2);
 * 2.格式:
 *      -> :lambda操作符 或 箭头操作符
 *      ->左边:lambda形参列表 (其实就是接口中的抽象方法的形参列表)
 *      ->右边:lambda体 (其实就是重写的抽象方法的方法体)
 *
 * 3.Lambda表达式的使用:(分为6种情况介绍)
 *
 *    总结:
 *    ->左边:lambda形参列表的参数类型可以省略(类型推断);如果lambda形参列表只有一个参数,其一对()也可以省略
 *    ->右边:lambda体应该使用一对{}包裹;如果lambda体只有一条执行语句(可能是return语句),省略这一对{}和return关键字
 */
public class LambdaTest1 {

    //语法格式四:Lambda若只需要一个参数时,参数的小括号可以省略
    @Test
    public void test5(){
        Consumer<String> c1 = (s) -> {
            System.out.println(s);
        };
        c1.accept("先天人性无善恶,后天人性有善恶。");


        Consumer<String> c2 = s -> {
            System.out.println(s);
        };
        c2.accept("如果没有邪恶的话我们怎么会知道人世间的那些善良呢?");
    }

    //语法格式五:Lambda需要两个或以上的参数,多条执行语句,并且可以有返回值
    @Test
    public void test6(){
        Comparator<Integer> c1 = new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                System.out.println(o1);
                System.out.println(o2);
                return o1.compareTo(o2);
            }
        };
        System.out.println(c1.compare(15,23));

        System.out.println("\\\\\\\\\\\\\\\\\\\\\\\\\\");

        Comparator<Integer> com2 = (o1,o2) -> {
            System.out.println(o1);
            System.out.println(o2);
            return o1.compareTo(o2);
        };
        System.out.println(com2.compare(16,8));
    }

    //语法格式六:当Lambda体只有一条语句时,return与大括号若有,都可以省略
    @Test
    public void test7(){
        Comparator<Integer> c1 = (o1,o2) -> {
            return o1.compareTo(o2);
        };
        System.out.println(c1.compare(16,8));


        Comparator<Integer> c2 = (o1,o2) -> o1.compareTo(o2);
        System.out.println(c2.compare(17,24));
    }

    @Test
    public void test8(){
        Consumer<String> c1 = s -> {
            System.out.println(s);
        };
        c1.accept("先天人性无善恶,后天人性有善恶。");


        Consumer<String> c2 = s -> System.out.println(s);
        c2.accept("如果没有邪恶的话我们怎么会知道人世间的那些善良呢?");
    }
}

3 方法引用与构造器引用

  • 当要传递给Lambda体的操作,已经有实现的方法了,可以使用方法引用!
  • 方法引用看做是Lambda表达式深层次的表达。方法引用就是Lambda表达式,也就是函数式接口的一个实例,通过方法的名字来指向一个方法,可以认为是Lambda表达式的一个语法糖。
  • 要求:实现接口的抽象方法的参数列表和返回值类型,必须与方法引用的方法的参数列表和返回值类型保持一致!
  • 格式:使用操作符 “::” 将类(或对象) 与方法名分隔开来。
    如下三种主要使用情况:
    对象::实例方法名
    类::静态方法名
    类::实例方法名

总结

作为程序员第 164 篇文章,每次写一句歌词记录一下,看看人生有几首歌的时间,wahahaha …
Java8的lambda无介绍快使用Java8的lambda无介绍快使用Java8的lambda无介绍快使用

Lyric: 印地安老斑鸠 平常话不多

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/110711.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!