java8新技术_java8:新特性

1. java8 引入了landba 表达式跟 stream 是 java8更新的核心,本章我们主要讲landba

lambda 功能语法介绍

Java8 引入了一个新的操作符  “->” ,该操作符称为 箭头操作符,lambda 操作符  , 该箭头将表达试分为俩部分,分别是操作符左边,和操作符右边,

左边:方法参数()

右边:所需执行的功能,一般我们称为操作体

需要注意的是,lambda 只支持一个抽象方法的接口,列如 Runnable 接口从今以后,这部分接口我们可以不用在使用接口的匿名内布类了,可以使用Lambda  来代替, 下面演示一个案例,让我们更直观的感受Lambda给我们带来的好处

@Test

public void Test_Lambda(){

/**

* 创建一个线程,以前的写法

*/

Runnable r1 = new Runnable() {

@Override

public void run() {

System.out.println("这是匿名内不类的写法");

}

};

//        调用方法r1

r1.run();

/**

*

* 这是lambda 表达式的写法

*/

Runnable r2 = () -> System.out.println("这是lambda 表达式的写法");

//调用r2

r2.run();

}

运行结果如下

b5b0b1954d7b1b86a4242bbd9d0c05eb.gif

LamdbaDemo1.png (134.18 KB, 下载次数: 5)

2017-11-28 17:31 上传

我们发现,虽然功能一摸一样,但是lambda 的代码简洁了很多,我们来分析刚刚的Lambda 表达式

//这是Lambda表达式

() -> System.out.println("这是lamdba 表达式的写法");

// "->" lambda 操作符

可以把表达式看成俩部分

- 左边 :  ()    方法参数 Runnable 的run 方法是没有参数的,所以括号里不用填参,

- 右边 : 操作体,也就是需要执行的语句,

案例演示

无参,无返回值(演示接口  Runnable)

刚才我们演示了 无参数,无返回值的方法 , 所以我们就不再演示 无参数,无返回值的方法了,

语法    () -> System.out.println(“操作语句”)

有参,无返回值(演示接口 Consumer)

b5b0b1954d7b1b86a4242bbd9d0c05eb.gif

Lambda有参无返2.png (193.25 KB, 下载次数: 2)

2017-11-28 17:33 上传

分析代码前,我们来看consumer接口

b5b0b1954d7b1b86a4242bbd9d0c05eb.gif

Consumer内部结构.png (19 KB, 下载次数: 1)

2017-11-28 17:34 上传

Consumer 内部只有一个方法,这符合Lambda的使用要求,方法里只有一个参数,参数类型可以自定义,

Consumer c = (t) -> System.out.println(t.replace("z",""));

//从表达试我们可以看出,我们定义的参数类型是String类型的参数,

// 我们把表达式分为左右俩边,以 "->"号来划分

左边:

(t)  其实相当于形参,我们定义的参数是String类型的,所以 t也是String类型的参数,  相当是(String t),

右边: System.out.println(t.replace("z",""));

因为有了String 类型的形参,所以我们可以在方法体(操作体里面使用),可以使用String类的API

补充 :如果方法只有一个参数,那么括号可以不写,下面这样写也是可以的,

Consumer c = t -> System.out.println(t.replace(“z”,""));

thread-384521-1-1.html

有多个参有返回值,多条操作语句(演示接口  Comparator)

首先,我们先来看看Comparator接口,里面只有一个compara的抽象方法,符合Lambda 使用要求,

thread-384521-1-1.html

语法介绍:

//如果有返回值的话,并且有多条操作语句那么操作体需要使用大括号引起来,Comparator c = (x,y) -> {};

代码演示

@Test

public void Test_Lambda03(){

Comparator c = (x,y) -> {

System.out.println("这是一个比较大小的接口");

return Integer.compare(x,y);

};

int compare = c.compare(7, 6);

System.out.println(compare);

}

运行结果如下

thread-384521-1-1.html

有参数,有返回值,但是只有一条操作语句,

语法介绍 :

ruturn  跟 大括号都可以省略不写,

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

代码演示

@Test

public void Test_Lambda04(){

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

int compare = c.compare(7, 6);

System.out.println(compare);

}运行结果如下

b5b0b1954d7b1b86a4242bbd9d0c05eb.gif

Lambda有参有返回值,一条语句.png (168.56 KB, 下载次数: 1)

2017-11-28 17:40 上传

Lambda的参数列表的参数类型可以不写,因为JVM可以从上下文推断出参数类型,即类型推断,其实我们以前也用过这种类似的语法,

@Test

public void Test_Lambda05(){

// 这里参数也是没有类型的,jvm也是从上下文获取参数类型的

String[] arr = {"aaa","bbb","ccc"};

}Java8中对类型推断也进行了升级,看下面的代码

@Test

public void Test_Lambda06(){

//在jdk1.8以前,这样写是通过不了编译的,但是在jdk1.8以后,完全没问题!因为它通过执行方法的目标方法获取了上下文的类型,

Test_07(new HashMap<>());

}

public void Test_07(Map map){

System.out.println(map);

}

结论:

“->”的左侧只有一个参数的话 括号可以省,类型可以省

“->”的右侧只有一条执行语句的话大括号可以省,

如果没有省的话语法如下

(Object x) ->{“这里写操作语句”}

建议省掉了,,,因为jdk1.8升级类型推断不就是想让我们偷点懒嘛,我们要领情, 嘿嘿(其实是懒)

省调后的语句为

(x) -> “这里写操作语句”

2.

需要注意的是,Lambda的使用需要函数试接口的支持, 那么什么是函数试接口的,其实就是只有一个抽象方法的接口, java提供了一种判断函数试接口的注解  @FunctionalInterface,如果接口没有报错,那么这个接口就是函数试接口,

下面是我归纳的一些核心函数式接口,

1. Consumer     消费型接口

void  accept(T t) ,提供的是无返回值的抽象方法

2. Supplier   供给型接口

T  get()  ,  提供的是有返无参的抽象方法

3. Function 函数型接口    T  是参数类型,R是返回值类型

R apply(T t)   提供的是 有参 有返的抽象方法.

4.Predicate 断言型接口

boolean test(T t)  提供的有参有返回的方法,返回的是boolean类型的返回值,,

下面给一些演示代码,让我们更直观的感受到函数接口的使用点,

1. Consumer     消费型接口演示

[Java] 纯文本查看 复制代码/**

* 消费演示

*/

@Test

public void Test_01(){

happy(1000.0,(m) -> System.out.println("爱怎么消费怎么消费Money="+(m-100)));

}

public void happy(Double money, Consumer consumer){

consumer.accept(money);

}

运行结果如下 ,

b5b0b1954d7b1b86a4242bbd9d0c05eb.gif

consumer.png (157.87 KB, 下载次数: 0)

2017-11-28 16:04 上传

thread-384521-1-1.html

2. Supplier   供给型接口演示

/**

* 需求 : 创建指定个数的整数,返回list的集合

*/

@Test

public  void Test_02(){

List list = happy_02(10, () -> (int)(Math.random() * 100));

System.out.println("list="+list);

}

public List happy_02(int count, Supplier sup){

ArrayList lists = new ArrayList<>();

for (int i = 0; i < count; i++) {

int e = sup.get();

lists.add(e);

}

return lists;

}

运行结果如下

b5b0b1954d7b1b86a4242bbd9d0c05eb.gif

Supplier.png (257.7 KB, 下载次数: 1)

2017-11-28 16:20 上传

thread-384521-1-1.html

3. 3. Function 函数型接口

/**

* 需求,写一个专门处理字符串的方法

*/

@Test

public void Test_03(){

String str = happy_04("我大黑马威武", (s) -> s.substring(1));

System.out.println("str="+str);

}

public String happy_04(String str , Function fun){

return fun.apply(str);

}运行结果如下

b5b0b1954d7b1b86a4242bbd9d0c05eb.gif

Function.png (277.59 KB, 下载次数: 5)

2017-11-28 16:32 上传

thread-384521-1-1.html

接下来来讲最后一个接口,

Predicate 断言型接口演示

/*

需求 :将满足条件的字符串放入集合中,

*/

@Test

public void Test04(){

List list = Arrays.asList("zsss", "lsss", "ww", "zl", "tq", "jjj");

ArrayList s1 = happy_05(list,(m) -> m.length() > 2);

System.out.println("list="+s1);

}

public ArrayList happy_05(List list,Predicate predicate){

ArrayList list2 = new ArrayList();

for (String s : list) {

if(predicate.test(s)){

list2.add(s);

}

}

return list2;

}运行结果如下

b5b0b1954d7b1b86a4242bbd9d0c05eb.gif

Predicate.png (136.58 KB, 下载次数: 1)

2017-11-28 16:55 上传

好了,接下来我们进入正题,来学习StreamApi

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值