写在前面

前面积极响应读者的需求,写了两篇Java新特征的文章。有小伙伴留言说:感受Lambda表达式很壮大啊!一行代码就能够搞定那么多功效!我想学习下Lambda表达式的语法,可以吗?我的回覆是:没问题!这不,Lambda表达式来了!

匿名类到Lambda表达式

我们先来看看从匿名类若何转换到Lambda表达式呢?

这里,我们可以使用两个示例来说明若何从匿名内部类转换为Lambda表达式。

  • 匿名内部类到Lambda表达式

使用匿名内部类如下所示。

Runnable r = new Runnable(){
    @Override
    public void run(){
        System.out.println("Hello Lambda");
    }
}

转化为Lambda表达式如下所示。

Runnable r = () -> System.out.println("Hello Lambda");
  • 匿名内部类作为参数通报到Lambda表达式作为参数通报

使用匿名内部类作为参数如下所示。

TreeSet<Integer> ts = new TreeSet<>(new Comparator<Integer>(){
    @Override
    public int compare(Integer o1, Integer o2){
        return Integer.compare(o1, o2);
    }
});

使用Lambda表达式作为参数如下所示。

TreeSet<Integer> ts = new TreeSet<>(
	(o1, o2) -> Integer.compare(o1, o2);
);

从直观上看,Lambda表达式要比通例的语法简练的多。

Lambda表达式的语法

Lambda表达式在Java语言中引入了 “->” 操作符, “->” 操作符被称为Lambda表达式的操作符或者箭头操作符,它将Lambda表达式分为两部门:

  • 左侧部门指定了Lambda表达式需要的所有参数。

Lambda表达式本质上是对接口的实现,Lambda表达式的参数列表本质上对应着接口中方式的参数列表。

  • 右侧部门指定了Lambda体,即Lambda表达式要执行的功效。

Lambda体本质上就是接口方式详细实现的功效。

我们可以将Lambda表达式的语法总结如下。

1.语法花样一:无参,无返回值,Lambda体只有一条语句

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

详细示例如下所示。

@Test
public void test1(){
    Runnable r = () -> System.out.println("Hello Lambda");
    new Thread(r).start();
}

2.语法花样二:Lambda表达式需要一个参数,而且无返回值

Consumer<String> func = (s) -> System.out.println(s);

详细示例如下所示。

@Test
public void test2(){
    Consumer<String> consumer = (x) -> System.out.println(x);
    consumer.accept("Hello Lambda");
}

3.语法花样三:Lambda只需要一个参数时,参数的小括号可以省略

Consumer<String> func = s -> System.out.println(s);

详细示例如下所示。

@Test
public void test3(){
    Consumer<String> consumer = x -> System.out.println(x);
    consumer.accept("Hello Lambda");
}

4.语法花样四:Lambda需要两个参数,而且有返回值

BinaryOperator<Integer> bo = (a, b) -> {
    System.out.println("函数式接口");
    return a + b;
};

详细示例如下所示。

@Test
public void test4(){
    Comparator<Integer> comparator = (x, y) -> {
        System.out.println("函数式接口");
        return Integer.compare(x, y);
    };
}

5.语法花样五:当Lambda体只有一条语句时,return和大括号可以省略

BinaryOperator<Integer> bo = (a, b) -> a + b;

详细示例如下所示。

@Test
public void test5(){
    Comparator<Integer> comparator = (x, y) ->  Integer.compare(x, y);
}

6.语法花样六:Lambda表达式的参数列表的数据类型可以省略不写,由于JVM编译器能够通过上下文推断出数据类型,这就是“类型推断”

BinaryOperator<Integer> bo = (Integer a, Integer b) -> {
    return a + b;
};

等同于

BinaryOperator<Integer> bo = (a, b) -> {
    return a + b;
};

上述 Lambda 表达式中的参数类型都是由编译器推断得出的。 Lambda 表达式中无需指定类型,程序依然可以编译,这是由于 javac 凭据程序的上下文,在后台推断出了参数的类型。 Lambda 表达式的类型依赖于上下文环境,是由编译器推断出来的。这就是所谓的“类型推断”。

函数式接口

Lambda表达式需要函数式接口的支持,以是,我们有需要来说说什么是函数式接口。

只包罗一个抽象方式的接口,称为函数式接口。

可以通过 Lambda 表达式来建立该接口的工具。(若 Lambda表达式抛出一个受检异常,那么该异常需要在目的接口的抽象方式上举行声明)。

可以在随便函数式接口上使用 @FunctionalInterface 注解,这样做可以检查它是否是一个函数式接口,同时 javadoc 也会包罗一条声明,说明这个接口是一个函数式接口。

我们可以自界说函数式接口,并使用Lambda表达式来实现响应的功效。

例如,使用函数式接口和Lambda表达式实现对字符串的处置功效。

首先,我们界说一个函数式接口MyFunc,如下所示。

@FunctionalInterface
public interface MyFunc <T> {
    public T getValue(T t);
}

接下来,我们界说一个操作字符串的方式,其中参数为MyFunc接口实例和需要转换的字符串。

public String handlerString(MyFunc<String> myFunc, String str){
    return myFunc.getValue(str);
}

接下来,我们对自界说的函数式接口举行测试,此时我们通报的函数式接口的参数为Lambda表达式,而且将字符串转化为大写。

@Test
public void test6(){
    String str = handlerString((s) -> s.toUpperCase(), "binghe");
    System.out.println(str);
}

运行test6方式,得出的效果信息如下所示。

BINGHE

我们也可以截取字符串的某一部门,如下所示。

@Test
public void test7(){
    String str = handlerString((s) -> s.substring(0,4), "binghe");
    System.out.println(str);
}

运行test7方式,得出的效果信息如下所示。

bing

可以看到,我们可以通过handlerString(MyFunc<String> myFunc, String str)方式连系Lambda表达式对字符串举行随便操作。

注重:作为参数通报 Lambda 表达式:为了将 Lambda 表达式作为参数通报,吸收Lambda 表达式的参数类型必须是与该 Lambda 表达式兼容的函数式接口的类型 。

写在最后

若是以为文章对你有点辅助,请微信搜索并关注「 冰河手艺 」微信民众号,跟冰河学习Java8新特征。

最后,附上Java8新特征焦点知识图,祝人人在学习Java8新特征时少走弯路。

,

Sunbet

Sunbet www.hzjdjfls.com Sunbet是Sunbet的官方网站。Sunbt官网有你喜欢的Sunbet、申博APP下载、Sunbet最新网址、Sunbet管理网最新网址等。

Allbet Gaming声明:该文看法仅代表作者自己,与阳光在线无关。转载请注明:滨州论坛:【Java8新特征】Lambda表达式基础语法,都在这儿了!!
发布评论

分享到:

平顶山租房网:曝光!“大V账号”售假,年销售额上千万……
你是第一个吃螃蟹的人
发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。