您的位置:首页 > 编程语言 > Java开发

jdk1.8新特性中比较常用的几个介绍

2017-02-08 15:07 671 查看

如果看完觉得对您有帮助到,麻烦关注一下,您的关注是我继续更新的动力。谢谢!!

 

函数式接口

Lambda表达式是如何在java的类型系统中表示的呢?每一个lambda表达式都对应一个类型,通常是接口类型。而“函数式接口”是指仅仅只包含一个抽象方法的接口,每一个该类型的lambda表达式都会被匹配到这个抽象方法。因为 默认方法 不算抽象方法,所以你也可以给你的函数式接口添加默认方法。

我们可以将lambda表达式当作任意只包含一个抽象方法的接口类型,确保你的接口一定达到这个要求,你只需要给你的接口添加 @FunctionalInterface 注解,编译器如果发现你标注了这个注解的接口有多于一个抽象方法的时候会报错的。

示例如下:

@FunctionalInterfaceinterface Converter<F, T> {    T convert(F from);}Converter<String, Integer> converter = (from) -> Integer.valueOf(from);Integer converted = converter.convert("123");System.out.println(converted);    // 123

需要注意如果@FunctionalInterface如果没有指定,上面的代码也是对的。

译者注 将lambda表达式映射到一个单方法的接口上,这种做法在Java 8之前就有别的语言实现,比如Rhino JavaScript解释器,如果一个函数参数接收一个单方法的接口而你传递的是一个function,Rhino 解释器会自动做一个单接口的实例到function的适配器,典型的应用场景有 org.w3c.dom.events.EventTarget 的addEventListener 第二个参数 EventListener。

 

stream及它关联的方法

 使用lambdas可以支持许多操作,如 map, filter, limit, sorted, count, min, max, sum, collect 等等 1、filter过滤器 例子:
System.out.println("====================jdk1.8版本前新特性Lambda,list遍历======================");
String[] strArr={"one","tow","three","five"};
List<String> strList = Arrays.asList(strArr);
//定义filters
Predicate<String> strFilter=(str)->(str.length()<=4);
Predicate<String> filterStr=(s)->(s.length()>3);
strList.stream()
.filter(strFilter)
.filter(filterStr)
.forEach((strlist)-> System.out.println(strlist));
}
测试结果: ====================jdk1.8版本前新特性Lambda,list遍历====================== five 2、limit返回结果限制 例子:
//定义filters
System.out.println("====================jdk1.8版本前新特性Lambda,list遍历======================");
String[] strArr={"one","tow","three","five"};
List<String> strList = Arrays.asList(strArr);
strList.stream().limit(2).forEach((str)-> System.out.println(str));
}
测试结果: ====================jdk1.8版本前新特性Lambda,list遍历====================== one tow 3、排序sorted() 例子:
//定义filters
System.out.println("====================jdk1.8版本前新特性Lambda,list遍历======================");
String[] strArr={"one","tow","three","five"};
List<String> strList = Arrays.asList(strArr);
ArrayList<String> list = new ArrayList<>();
// strList.stream().limit(2).forEach((str)-> System.out.println(str));
strList.stream()
.sorted((str01,str02)->(str01.length()-str02.length()))
.collect(toList());
4、获取最大最小值:min()和max()
System.out.println("====================jdk1.8版本前新特性Lambda,list遍历======================");
String[] strArr={"one","tow","three","five","eightt"};
List<String> strList = Arrays.asList(strArr);
//获取最大和最小
String s = strList.stream().min((s1, s2) -> (s1.length() - s2.length())).get();
System.out.println(s);
System.out.println("========================================");
String ss=strList.stream().max((s3,s4)->(s3.length()-s4.length())).get();
System.out.println(ss);
  Lambda的使用   1、匿名类的使用
public class LambdaTest {
public static void main(String[] args) {
List<String> names= Arrays.asList("peter","anna","nike","xenia");
//jdk1.8前的编码
Collections.sort(names, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.compareTo(o2);
}
});
for (String str:names){
System.out.println(str);
}
System.out.println("====================jdk1.8新特性Lambda======================");
Collections.sort(names,(String a,String b)->{return b.compareTo(a);});
for (String str:names){
System.out.println(str);
}
System.out.println("====================jdk1.8新特性Lambda,最简表达式======================");
Collections.sort(names,(a,b)->a.compareTo(b));
for (String str:names){
System.out.println(str);
}
}
}
2、list遍历

System.out.println("====================jdk1.8版本前新特性Lambda,list遍历======================");
String[] strArr={"one","tow","three"};
List<String> strList = Arrays.asList(strArr);
for (String str:strList){
System.out.println(str);
}
System.out.println("====================jdk1.8版本新特性Lambda,list遍历,表达式一======================");
strList.forEach((str)-> System.out.println(str+"; "));
System.out.println("====================jdk1.8版本新特性Lambda,list遍历,表达式二======================");
strList.forEach(System.out::println);
}

 接口的默认方法(非抽象方法) 1、接口
package com.bbtree.project.api;


/**
* Created by Administrator on 2017/1/3.
*/
public interface Animal {
void printName(String animalName);

default void eat(String animalName){
System.out.println(animalName+"准备进食");
}
default void run(String animalName){
System.out.println(animalName+"跑起来!");
}

}
2、实现类(只实现抽象方法)
package com.bbtree.project.api.impl;

import com.bbtree.project.api.Animal;

/**
* Created by Administrator on 2017/1/3.
*/
public class AnimalImpl implements Animal {
@Override
public void printName(String animalName) {
System.out.println("这是一只"+animalName);
}
}
3、测试类
public class JDKTest {

@Test
public void animalTest(){
AnimalImpl animal = new AnimalImpl();
animal.printName("猪");
System.out.println("========上面为继承方法,下面为jdk1.8中新特性,非抽象方法======");
animal.eat("猪");
animal.run("狗");
}
}
4、测试结果 这是一只猪 ========上面为继承方法,下面为jdk1.8中新特性,非抽象方法====== 猪准备进食 狗跑起来!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: