文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

一文搞懂Java中的lambda匿名函数

2024-11-30 13:24

关注

语法:

Lambda表达式可以使用这个语法->来表示。

示例:

零参数:() -> expression

interface PrintInfo {
  void print();
 }

 class TestLambda {
  
    static void printJob(PrintInfo printInfo) { 
      printInfo.print(); 
    }
  
    public static void main(String[] args) {
       printJob(() -> System.out.println("We're learning Java 8 fundamentals !"));
    }
 }

Output: We’re learning Java 8 fundamentals !

一个参数:parameter -> expression

interface PrintInfo {
  void print(String data);
 }

 class TestLambda {

  static void printJob(PrintInfo printInfo, String data) {
   printInfo.print(data);
  }

  public static void main(String[] args) {
   printJob(statement -> System.out.println("We're learning " + statement), "Lambda");
  }
 }

Output: We're learning Lambda

多个参数:(parameter1, parameter2) -> expression

interface PrintInfo {
  void print(String data1, String data2);
 }

 class TestLambda {

  static void printJob(PrintInfo printInfo, String data1, String data2) {
   printInfo.print(data1, data2);
  }

  public static void main(String[] args) {
   printJob((statement1, statement2) -> System.out.println("We're learning " + statement1 + " and "+ statement2), "Lambda", "it's uses");
  }
 }

Output: We're learning Lambda and it's uses

复杂表达式:(parameter1, parameter2) -> { complex code block }

interface PrintInfo {
  void print(String data1, String data2);
}

 class TestLambda {

  static void printJob(PrintInfo printInfo, String data1, String data2) {
     printInfo.print(data1, data2);
  }

  public static void main(String[] args) {
     printJob((statement1, statement2) -> {
        System.out.println("We're learning " + statement1 + " and "+ statement2);
        System.out.println("This is a multi line lambda");
        System.out.println("This is a complex lambda implementation");
       }, 
        "Lambda",
        "it's uses"
      );
   }
 }

Output: We’re learning Lambda and it’s uses

This is a multi line lambda

This is a complex lambda implementation

2 方法引用

方法引用是一种紧凑、易读的Lambda表达式,用于已经具有名称的方法。简单地说,我们可以使用方法引用从Lambda函数中调用方法。

语法:

Object::method

让我们来看看如何使用Lambda打印列表中的元素:

public void print(List list) {
    list.forEach(l -> System.out.println(l));
}

可以使用方法引用,如下所示:

public void print(List list) {
    list.forEach(System.out::println);
}

如您所见,这使代码更加清晰、精确和易于阅读。

同样地,我们可以使用Classname::methodName来表示对静态方法的调用。

public static void main(String[]args){
    List fruits = new ArrayList<>();
    fruits.add("mango");
    fruits.add("banana");
    fruits.add("kiwi");
    fruits.add("orange");

    fruits.forEach(Test::process);
}

private static void process(String value) {
    System.out.println("processed fruit: " + value);
}

同时,我们可以使用Object to be instantiated::new来使用方法引用引用构造函数。

public static void main(String[]args){
      List fruits = new ArrayList<>();
      fruits.add("mango");
      fruits.add("banana");
      fruits.add("kiwi");
      fruits.add("orange");

      fruits.stream()
              .map(Fruit::new)
              .toArray(Fruit[]::new);
}

class Fruit {
    public Fruit(String name) {
        this.name = name;
    }
}

方法引用也可以用于Comparator。

按名称对水果列表排序:

public static void process(List fruits) {
    fruits.stream()
            .sorted(Comparator.comparing(Fruit::getName))
            .forEach(System.out::println);
}

3 Lambda的不同用途

遍历列表

public static void main(String[] args) {
   List fruits = List.of("mango", "oranges", "banana", "kiwi", "apple");
   fruits.forEach(fruit -> System.out.println(fruit));
}

遍历Map

public static void main(String[] args) {
   Map map = new HashMap<>();
   map.put("value1", 10);
   map.put("value2", 20);
   map.put("value3", 30);
   map.put("value4", 40);
   map.forEach((key, value) -> System.out.println("key: " + key + ", value: " + value));
  }

创建Runnable和Callable

Runnable是一个函数式接口,因此我们可以使用Lambda表达式来表示它。

使用匿名类创建Runnable的典型方式

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

同样的Lambda表达式实现如下:

public static void main(String[] args) {
  Runnable runnable = () -> System.out.println("Hello World !");
}

同样地,Callable也可以实现:

public static void main(String args[]) throws InterruptedException {
    Callable callable = () -> {
      int sum = 0;
      for (int i = 0; i < 5; i++) {
        sum += i;
      }
      return sum;
    };
}

Predicate

使用Lambda函数表示Predicate:

public class HelloWorld{

     public static void main(String []args){
        Predicate predicate = (i) -> i > 10;
        System.out.println(predicate.test(15));
     }
}

Output: True

Consumer

使用Lambda函数表示Consumer:

public class HelloWorld{

     public static void main(String []args){
       //例1
        Consumer consumer = System.out::println;
        consumer.accept(10);

       //例2
        List inputs = new ArrayList<>();
        Consumer consumer = str -> inputs.add(str);
        consumer.accept("first");
        consumer.accept("second");
        inputs.forEach(e -> System.out.println(e));
     }
}

Example 1 output: 10,Example 2 output: first \n second

Comparator

Comparator是Java中的一个函数式接口,因此我们可以使用Lambda函数来表示它。

下面我们使用Lambda创建一个Comparator:

public static void process(List movies) {
    Comparator movieComparator = (m1, m2) -> m1.getRating() - m2.getRating();
    movies.sort(movieComparator);
}

让我们看看更多的例子:

按自然顺序排序数字列表:

private static void process(List numbers) {
    numbers.stream()
            .sorted(Comparator.naturalOrder())
            .forEach(System.out::println);
}

如果我们要根据多个参数对列表进行排序,则可以使用Comparator的thenComparing方法,如下所示:

private static void process(List movies) {
    movies.stream()
            .sorted(Comparator.comparing(Movie::getName)
                    .thenComparing(Movie::getRating)
            )
            .forEach(System.out::println);
}

将排序后的列表反转:

private static void process(List movies) {
    movies.stream()
            .sorted(Comparator.comparing(Movie::getName)
            .thenComparing(Movie::getRating)
            .reversed())
            .forEach(System.out::println);
}

4 总结

本文中,我们探讨了Lambda函数,看了很多不同的Lambda函数的例子,我们还了解了如何使用方法引用和Comparator。

来源:Java学研大本营内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯