java8新特性——Lambda表达式

  上文中简单介绍了一下java8得一些新特性,与优点,也是为本次学习java8新特性制定一个学习的方向,后面几篇会根据上文中得新特性一一展开学习。本文就从java8新特性中比较重要的Lambda表达式开始学学习。

一、为什么要使用Lambda表达式

  Lambda是一个匿名函数,我们可以baLambda表达式理解为是一段可以传递的代码(将代码像数据一样进行传递)。可以写出更简洁,更灵活的代码。作为一种更紧凑得代码风格,使得java得语言表达能力得到提升。Lambda表达式需要函数式接口的支持,接口中只有一个抽象方法得接口叫做函数式接口。可以使用@FunctionalInterface修饰,可以检查是否是函数式接口。

二、Lambda表达式基础语法

  java8中新增了一个操作符,“->”箭头表达式,也叫Lambda操作符。Lambda表达式左侧为Lambda表达式得参数列表,右侧为操作步骤与逻辑,也叫做Lambda体。Lambda表达式有几种语法格式,下面就来一一学习。

  1. 无参数,无返回值(()-> 接口得功能)。

 1 /**
 2      *
 3      * 语法一:无参数,无返回值(()-> 执行的代码)
 4      */
 5     @Test
 6     public void test1() {
 7         //java8实现Runnable方法
 8         Runnable run = () -> System.out.println("Hello Lambda");
 9         run.run();
10
11         //java8以前得写法
12         Runnable run1 = new Runnable() {
13
14             @Override
15             public void run() {
16                 System.out.println("Hello World");
17             }
18         };
19         run1.run();
20     }

  其中需要注意得是,在java1.7以前,在匿名内部类中使用同级别得得局部变量时,这个局部变量必须时final类型得,但是在java8以后,局部变量不用final修饰了,final可以省略,但是其类型还是默认为final类型的。

  2.一个参数,无返回值

1     /**
2      * 语法二:一个参数,无返回值
3      */
4     @Test
5     public void test2() {
6         Consumer<String> t = (x) -> System.out.println(x);
7         t.accept("Hello Lambda");
8     }

  注意,如果只有一个参数,小括号可以不写。

1     /**
2      * 语法二:一个参数,无返回值
3      */
4     @Test
5     public void test2() {
6         Consumer<String> t = x -> System.out.println(x);
7         t.accept("Hello Lambda");
8     }

  3. 多个参数,多条语句,有返回值。

 1     /**
 2      * 语法三:多个参数,多条语句,有返回值。
 3      */
 4     @Test
 5     public void test3() {
 6         Comparator<Integer> com = (x, y) -> {
 7             System.out.println(x);
 8             System.out.println(y);
 9             return 0;
10         };
11         System.out.println(com.compare(1, 3));
12     }

  4.多个参数,一条语句,有返回值

 1     /**
 2      * 语法四:多个参数,一条语句,有返回值
 3      */
 4     @Test
 5     public void test4() {
 6         //只有一条语句与返回值时,大括号和return都可以省略
 7         Comparator<Integer> com = (x, y) -> 0;
 8
 9         System.out.println(com.compare(1, 3));
10     }

  注意:只有一条语句与返回值时,大括号和return都可以省略。

  5.Lambda表达式得参数列表可以不用写,因为JVM编译器可以通过上下文推断出类型,即“类型推断”

三、Lambda表达式需要“函数式接口”的支持

  函数式接口:接口中只有一个抽象方法时,那么这个接口叫做函数式接口。函数式接口可以使用@FunctionalInterface修饰,jvm会自动检查该接口是否为函数式接口。

1 @FunctionalInterface
2 public interface myLambdaModle<T> {
3
4     public int test(T t1, T t2);
5
6 }

  需求:对两个数进行运算

 1     @Test
 2     public void test5() {
 3         int sum1 = myTest(3, 6, (x, y) -> x*y);
 4         int sum2 = myTest(3, 6, (x, y) -> x-y);
 5         int sum3 = myTest(3, 6, (x, y) -> x+y);
 6         int sum4 = myTest(3, 6, (x, y) -> x/y);
 7     }
 8
 9
10     public int myTest(int o1, int o2, myLambdaModle<Integer> m) {
11         return m.test(o1, o2);
12     }

  这样,我们就可以使用一个接口就对数字进行运算操作,具体什么操作可以自己去定义。

  从本文可以看出,原来JDK1.7以前,如果定义一个抽象方法,一个方法,就只能实现一种运算,而现在,实现完全可以自己去定义代码简化了许多。后面随笔会继续学习java8的四大内置得核心函数式接口。

    

原文地址:https://www.cnblogs.com/wuyx/p/8972311.html

时间: 2024-10-01 20:55:48

java8新特性——Lambda表达式的相关文章

Java核心技术之Java8新特性-Lambda表达式

1 总体说明 Java8新特性概述 函数式接口 Lambda表达式(闭包) 2 Java8新特性概述 Oracle公司于2014年3月发布了Java8正式版,该版本是自JDK5.0以来最具革命性的版本. Java8为Java语言.编译器.类库和JVM带来了大量的新特性.接下来的内容将会详细说明Java8在Java语言方面的新特性以及它们的使用场景. 3 函数式接口 Java8引入的一个核心概念是函数式接口(Functional Interfaces):如果一个接口定义一个唯一的抽象方法,那么这个

Java8新特性 - Lambda表达式 - 基本知识

A lambda expression is an unnamed block of code (or an unnamed function) with a list of formal parameters and abody. Java8中的lambda表达式不同于C#,使用的是-> eg: // Takes an int parameter and returns the parameter value incremented by 1 (int x) -> x + 1 // Take

Java8新特性 - Lambda 表达式

 是什么? Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性. Lambda 属于函数式编程思想,允许把函数作为一个方法的参数(函数作为参数传递进方法中). 怎么使用? 使用前提: 必须支持上下文推导,要能够推导出来 Lambda 表达式表示的是哪个接口中的内容. 可以使用接口当做参数,然后传递 Lambda 表达式(常用),也可以将 Lambda 表达式赋值给一个接口类型的变量. Lambda 表达式的省略规则: 小括号中的参数类型可以省略. 如果小括号中只有一个

java8新特性-Lambda表达式(二)

Java8新增了java.util.funcion包,里面包含常用的函数接口,这是Lambda表达式的基础,Java集合框架也新增部分接口,以便与Lambda表达式对接. Collections中的常用函数接口 Java集合框架的接口继承结构: 上图中蓝色标记和橙色标记的接口类,表示在Java8中加入了新的接口方法,由于继承关系,他们相应的子类也会继承这些方法. 下面用一张表列举这些方法 接口名 Java8新加入的方法 Collection removeIf() spliterator() st

Java8新特性-Lambda表达式

1.  什么是Lambda表达式? Lambda表达式就是可以把函数作为参数传递,或者说把代码作为数据传递给函数. 2. Lambda表达式的语法格式 基本语法格式如下: 基本语法下多个变体的说明: 1). 多个参数中间用逗号分隔: 1 (int m,int n)=>{int result=m*n; Console.WriteLine(result);} 2). 参数类型可以省略: 1 (m,n)=>{int result=m*n; Console.WriteLine(result);} 3)

Java8新特性——lambda表达式.(案例:词频统计)

需求:读入一个文本文件,确定所有单词的使用频率并从高到低排序,打印出所有单词及其频率的排序列表 先用传统方法解: 1 package cn._1.wordfrequency; 2 3 import java.util.HashSet; 4 import java.util.Map; 5 import java.util.Set; 6 import java.util.TreeMap; 7 import java.util.regex.Matcher; 8 import java.util.reg

IntelliJ Idea中使用Java8新特性lambda表达式

环境: 环境变量JAVA_HOME配置jdk1.8 idea配置支持lambda: File -> Project Structure -> Modules ->  Language level, 选择: 8-Lambdas, type annotations etc. File -> Project Structure -> Project  ->  Project language level, 选择: 8-Lambdas, type annotations etc

Java8新特性——lambda表达式.(案例:完全数分类)

需求:输入一个数,判断其类型(完全数,过剩数,不足数) 完全数:自身之外所有因数和==自身 过剩数:自身之外所有因数和>自身 不足数:自身之外所有因数和<自身 1 package cn._3.numberclassifier; 2 3 //BEGIN number_classifier_java8 4 import java.util.List; 5 import java.util.stream.IntStream; 6 7 import static java.lang.Math.sqrt

Java8新特性——Lambda表达式-1

一.抛出需求 超市中挑选苹果,挑选条件多样化. 示例:找出绿色并且重量等于150的苹果,找出红色并且重量小于120苹果. 1.苹果类 public class Apple { private String color; private int weight; public Apple(String color, int weight) { this.color = color; this.weight = weight; } public String getColor() { return c