jdk8特性

最近写java就把jdk8的特性复习了复习做个总结,想想9的模块化10的zgc还有后面新版本的http客户端之类的东西,还是觉得果然go才是世界上最好的语言啊.我讨厌java.

java8

lambda表达式

lambda表达式主要用来定义执行的方法类型接口,例如一个简单方法接口.
比如说我有一个借口,在以前的话我需要继承接口实现这个接口的实际执行方法.
现在我只需要在栈上初始化这个接口并在等号后面写上lambda表达式即可因为
lambda表达式本身就相当于闭包,是函数的实际实现
这样就不需要我们再去写匿名方法.

表达式写法
1.不写参数类型
编译器可统一识别
(a,b)->a+b
2.写参数类型
(int a,int b)->a+b
3.接受两个参数需要加(),单参数不需要
4.如果计算过程只有一个语句就不需要{}
5.如果使用了{}就必须写return

lambda表达式不可修改局部变量
而且lambda表达是的参数是不允许和局部变量同名的.

方法引用

类::方法
对象::方法

函数式接口

@FunctionalInterface
interface GreetingService
{
void sayMessage(String message);
}
public class funcIMP {
public static void main(String[] args) {
GreetingService greetingService=message -> System.out.println(message);
greetingService.sayMessage("shabi");
}
}

默认方法

就是说接口可以有实现方法,而且不需要实现类去实现其方法
但是有时候一个类实现了多个接口,这些接口具有相同的默认方法
解决方案有两种
1.创建自己的默认方法来覆盖重写
2.用super来调用指定接口的默认方法

Stream

对集合的聚合处理
List strings= Arrays.asList("aaefwefwefewfwefwefwef","","aaaaa","dfdsfs","sdsdsdsdsd");
List filtered=strings.stream().filter(string->!string.isEmpty()).collect(Collectors.toList());
比如说这两行代码
第二行就是一个标准的stream
filter就是一个stream函数,他的参数是一个lambda,他过滤出不为空的元素.collect将过滤出的元素归类到一个新的list里面.

forEach

Stream 提供了新的方法 'forEach' 来迭代流中的每个数据。以下代码片段使用 forEach 输出了10个随机数:

Random random = new Random();
random.ints().limit(10).forEach(System.out::println);

map

map 方法用于映射每个元素到对应的结果,以下代码片段使用 map 输出了元素对应的平方数:

List numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
// 获取对应的平方数
List squaresList = numbers.stream().map( i -> i*i).distinct().collect(Collectors.toList());

limit 方法用于获取指定数量的流。 以下代码片段使用 limit 方法打印出 10 条数据:

Random random = new Random();
random.ints().limit(10).forEach(System.out::println);

sorted

sorted 方法用于对流进行排序。以下代码片段使用 sorted 方法对输出的 10 个随机数进行排序:

Random random = new Random();
random.ints().limit(10).sorted().forEach(System.out::println);

parallel

parallelStream 是流并行处理程序的代替方法。以下实例我们使用 parallelStream 来输出空字符串的数量:

List strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
// 获取空字符串的数量
int count = strings.parallelStream().filter(string -> string.isEmpty()).count();

Collectors

Collectors 类实现了很多归约操作,例如将流转换成集合和聚合元素。Collectors 可用于返回列表或字符串:

Liststrings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
List filtered = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());

System.out.println("筛选列表: " + filtered);
String mergedString = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.joining(", "));
System.out.println("合并字符串: " + mergedString);

统计

另外,一些产生统计结果的收集器也非常有用。它们主要用于int、double、long等基本类型上,它们可以用来产生类似如下的统计结果。

List numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);

IntSummaryStatistics stats = numbers.stream().mapToInt((x) -> x).summaryStatistics();

System.out.println("列表中最大的数 : " + stats.getMax());
System.out.println("列表中最小的数 : " + stats.getMin());
System.out.println("所有数之和 : " + stats.getSum());
System.out.println("平均数 : " + stats.getAverage());

还有两样没写一个是Optional 类一个是新的时间api.有时间再说吧.

你可能感兴趣的:(jdk8特性)