前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >深入理解Java8 Lambda表达式

深入理解Java8 Lambda表达式

作者头像
ZhangXianSheng
发布2019-09-05 16:37:06
4210
发布2019-09-05 16:37:06
举报

一、Lambda表达式是什么?

Lambda表达式有两个特点:一是匿名函数,二是可传递。

匿名函数的应用场景是: 通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用Lambda表达式。lambda表达式所表示的匿名函数的内容应该是很简单的,如果复杂的话,干脆就重新定义一个函数了,使用lambda就有点过于执拗了。

可传递使用场景是: 就是将Lambda表达式传递给其他的函数,它当做参数,Lambda作为一种更紧凑的代码风格,使Java的语言表达能力得到提升。

二、Lambda表达式语法

Lambda表达式在Java语言中引入了一个新的语法元素和操作符。这个操作符为"->",该操作符被称为Lambda操作符或箭头操作符,它将Lambda分为两个部分:

左侧:指定了Lambda表达式所需要的所有参数 右侧:指定了Lambda体,即Lambda表达式所要执行的功能。

常见的语法格式:

语法格式一:无参,无返回值,Lambda体只需要一条语句。

1

Runnable r = () -> System.out.println("Hello Lambda!");

语法格式二:Lambda需要一个参数

1

Consumer<String> con = (x) -> System.out.println(x);

语法格式三:Lambda只需要一个参数时,参数的小括号可以省略

1

Consumer<String> con = x -> System.out.println(x);

语法格式四:Lambda需要两个参数,并且有返回值

1 2 3 4

Comparator<Integer> com = (x, y) -> { System.out.println("函数式接口"); return Integer.compare(x, y); };

语法格式五:当Lambda体只有一条语句时,return与大括号可以省略

1

Comparator<Integer> com = (x, y) -> Integer.compare(x, y);

语法格式六:数据类型可以省略,因为可由编译器推断得出,称为类型推断

1 2 3 4

BinaryOperator<Long> operator = (Long x, Long y) -> { System.out.println("实现函数接口方法"); return x + y; };

三、Lambda表达式实战

实战1:线程

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

public class Test { public static void main(String[] args) { // Java8之前: new Thread(new Runnable() { public void run() { System.out.println("hello world"); } }).start(); // Java8方式: new Thread(() -> System.out.println("hello world")).start(); } }

实战2:集合元素的遍历

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18

public class Test2 { public static void main(String[] args) { // Java8之前: List<String> list1 = Arrays.asList("a", "b", "c", "d"); for (String str : list1) { System.out.println(str); } // Java 8之后: List list2 = Arrays.asList("a", "b", "c", "d"); list2.forEach(n -> System.out.println(n)); // 使用Java 8的方法引用更方便,方法引用由::双冒号操作符标示, list2.forEach(System.out::println); } }

实战3:map函数。

map函数可以说是函数式编程里最重要的一个方法了。map的作用是将一个对象变换为另外一个。

1 2 3 4 5 6 7 8 9 10 11 12 13 14

import java.util.Arrays; import java.util.List; public class Test3 { public static void main(String[] args) { map(); } public static void map() { List<Double> cost = Arrays.asList(10.0, 20.0, 30.0); cost.stream().map(x -> x + x * 0.05).forEach(x -> System.out.println(x)); } }

实战4: reduce函数。

map的作用是将一个对象变为另外一个,而reduce实现的则是将所有值合并为一个。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

import java.util.Arrays; import java.util.List; public class Test4 { public static void main(String[] args) { mapReduce(); } public static void mapReduce() { List<Double> cost = Arrays.asList(10.0, 20.0, 30.0); double allCost = cost.stream().map(x -> x + x * 0.05).reduce((sum, x) -> sum + x).get(); System.out.println(allCost); } }

实战5:过滤

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class Test5 { public static void main(String[] args) { filter(); } public static void filter() { List<Double> cost = Arrays.asList(10.0, 20.0, 30.0, 40.0); List<Double> filteredCost = cost.stream().filter(x -> x > 25.0).collect(Collectors.toList()); filteredCost.forEach(x -> System.out.println(x)); } }

实战6:Predicate过滤

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25

import java.util.Arrays; import java.util.List; import java.util.function.Predicate; public class Test6 { public static void filter(List<String> languages, Predicate<String> condition) { languages.stream().filter(x -> condition.test(x)).forEach(x -> System.out.println(x + " ")); } public static void main(String[] args) { List<String> languages = Arrays.asList("Java", "Python", "scala", "Shell", "R"); System.out.println("Language starts with J: "); filter(languages, x -> x.startsWith("J")); System.out.println("\nLanguage ends with a: "); filter(languages, x -> x.endsWith("a")); System.out.println("\nAll languages: "); filter(languages, x -> true); System.out.println("\nNo languages: "); filter(languages, x -> false); System.out.println("\nLanguage length bigger three: "); filter(languages, x -> x.length() > 4); } }

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、Lambda表达式是什么?
  • 二、Lambda表达式语法
    • 常见的语法格式:
    • 三、Lambda表达式实战
      • 实战1:线程
        • 实战2:集合元素的遍历
          • 实战3:map函数。
            • 实战4: reduce函数。
              • 实战5:过滤
                • 实战6:Predicate过滤
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档