JAVA中JDK8新特性:

目录

1.lambda表达式:

2.stream的用法:

3.DateApi类:

4.接口新特性:


1.lambda表达式:

java中的函数式接口都可以使用lambda表达式来表示,所谓函数式接口(Functional Interface)是指包含一个方法的抽象接口(SAM)。

格式:lambda表达式实际上就是代码块的传递的实现

(parameters) -> expression 或者 (parameters) -> {statements;}

注意事项:

 a.括号里的参数可以省略其类型,编译器会根据上下文来推导参数的类型,你也可以显式地指定参数类型,如果没有参数,括号内可以为空。

b.方法体,如果有多行功能语句用大括号括起来,如果只有一行功能语句则 可以省略大括号。

c.可替代匿名内部类。

public class LambdaDemo {
	public static void main(String[] args) {
		/**
		 * 使用lambda处理多线程
		 * public Thread(Runnable commend){}
		 * Runnable是函数式接口
		 */
		//正常写法:使用匿名内部类
		new Thread(new Runnable() {
			@Override
			public void run() {
				System.out.println("***");
			}
		}).start();
		
		//使用lambda表达式的写法,Runnable是函数式接口
		new Thread(()->System.out.println("...")).start();

		Runnable r = ()->System.out.println("ddd");
		new Thread(r).start();;
		
		/**
		 * 使用lambda处理集合的排序:过滤器
		 * Collections.sort(List list,Comparator c)
		 * list.sort(Comparator c);
		 * Comparator是函数式接口
		 */
		List list = Arrays.asList(12,43,65,35,5);

		Collections.sort(list, (o1,o2)->o2-o1);
		System.out.println(list);  //降序:[65, 43, 35, 12, 5]
		
		list.sort((o1,o2)->o2-o1);
		System.out.println(list);  //降序:[65, 43, 35, 12, 5]
		
		/**
		 * 使用lambda处理集合的遍历:
		 * list.forEach(Consumer c);
		 * map.forEach(BiConsumer action);
		 * Consumer和BiConsumer都是函数式接口
		 */
		list.forEach((t)->System.out.println(t));
		list.forEach(System.out::println);
		
		Map map = new HashMap<>();
		map.put(1, "s");
		map.put(2, "s1");
		map.put(3, "s2");
		map.forEach((k,v)->System.out.println(k+"="+v));
	}
}

 方法引用:

是lambda表达式的简写形式,如果lambda表达式只是调用一个特定的已经存在的方法,则可以使用方法引用。

使用“::”操作符将方法名和对象或类的名字分隔开来。

list.forEach((t)->System.out.println(t));
list.forEach(System.out::println);

2.stream的用法:

Stream接口位于java.util.stream包中,是一个来自数据源的元素队列并支持聚合操作:

JDK8以后,public final class StreamSupport{},无论哪种方式创建的stream()方法,底层都是调用的StreamSupport类中的stream()方法。

获取Stream对象的五种方式:

使用集合创建:

List list = Arrays.asList(1,5,6,3,8);
Stream stream = list.stream();

使用数组创建:

String[] arr = {"燃","冬","青"};
Stream stream2 = Arrays.stream(arr);

使用value创建:

Stream stream3 = Stream.of(1,2,5,3);

使用iterate创建:

Stream stream4 = Stream.iterate("h", n->n+5).limit(5);
stream4.forEach(System.out::print); //hh5h55h555h5555

使用generate创建:

Stream stream5 = Stream.generate(Math::random).limit(2);
stream5.forEach(System.out::println);
==========================================
0.7759721033380993
0.11476503584538988

 获得Stream接口的对象后,都可以使用匿名内部类或lambda表达式的形式传参,从而调用接口中的方法。下面以集合为例,列举常用的几种方法的使用:

 

3.DateApi类:

4.接口新特性:

JDK8以前接口中只有抽象方法,子类实现接口时需要重写接口中的抽象方法。而在类的继承中,子类是可以继承父类的一些方法的。JDK8关于接口的特性修改,使得接口中可以定义所有子类都会需要的方法,这样不需要重写就可以继承下来。有助于接口的功能扩展以及打破单继承局限。近似的取代了抽象类的作用。

public interface Demo08 {
	void show(int a);
	default void text() {
		System.out.println("JDK8中的接口新特性...");
	}
}

5.Spliterator可分割迭代器:

Spliterator是一个可分割迭代器(splitable iterator),可以和iterator顺序遍历迭代器一起看。jdk1.8发布后,对于并行处理的能力大大增强,Spliterator就是为了并行遍历元素而设计的一个迭代器,jdk1.8中的集合框架中的数据结构都默认实现了spliterator。

spliterator类的数据结构:

你可能感兴趣的:(java)