java1.8新特性常用的特性

java1.8新特性常用的特性

默认方法

以前接口中没有方法体,当要修改某个接口时,该接口的所有实现类必须实现该接口的方法

为解决这一问题,新加了默认方法----- 接口中可以存在方法体了,必须在方法前面用default修饰表示默认方法

public interface MyInterface { 
		void sayHello(); 
		default void hello() { System.out.println("接口的默认方法"); } 
		
}

接口中可以有任意多个默认方法,实现类不需要实现这些方法,但是可以重写这些方法。

一个类可以实现多个接口,且这些接口可以有相同的方法,不过这种情况下就必须要重写同名的默认方法。

在java8中接口可以声明静态方法和私有方法。

public interface MyInterface { 
		void sayHello();
        default void hello() { System.out.println("接口的默认方法"); }
        
        static void sleep() { System.out.println("zzzzz......"); }
        
        static void jump() { System.out.println("i love jump!!"); }
        
        public static void main(String[] args) { 
        MyInterface.sleep(); jump(); 
        } 
}

注意: 当一个类实现了两个拥有同一个默认方法的接口时必须重写该方法。

接口中的静态方法可以通过接口名直接调用


函数式接口

什么是函数式接口 ?

​ :函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的

接口。

函数式接口可以被隐式转换为 lambda 表达式。

函数式接口的定义

		:当接口里只有一个抽象方法的时候,就是函数式接口,可以使用注解(@FunctionalInterface)强制 

​ 限定接口是函数式接口,即只能有一个抽象方法。

@FunctionalInterface 
public interface MyFunctionInterface {
    public void sayHello(); 
    default void sayHi() { System.out.println("Hi");}
}

函数式接口是整个Lambda表达式的一个根源,换句话来说java8中的Lambda表达式要想 彻底掌握,前提是要彻底理解好函数式接口

我们之前使用过的Runabel、Comparator等就是函数式接口

java8新增了许多函数式接口,在java.util.function包下。它包含了很多类,用来支持 Java 的函数式编程,该包中的函数式接口有非常多,先列举几种:

接口 描述
Consumer 代表了接受一个输入参数并且无返回的操作,常用于生产数据的场景
Supplier 无参数,返回一个结果。常用于消费数据的场景
Function 接受一个输入参数,返回一个结果。常用于类型转换的场景
Predicate 接受一个输入参数,返回一个布尔值结果。常用于条件判断的场景
更多内容请查阅资料…

Lambda

简化内部类的操作 用Lambda表达式实现的类不会产生class文件

无参无返回 ,一行

无参无返回,多行要加大括号

public class Lambda {
	public static void main(String[] args) {
		QQ q=()->System.out.println("加油");
		q.bos();
	}
}

@FunctionalInterface
interface QQ{
	void bos();
}

有参,有返回 一行可以不可以有return

有参,有返回 多行 用大括号 要return

public class Lambda {
	public static void main(String[] args) {
		QQ q=(a)->a;
		System.out.println(q.bos(10));
	}
}

@FunctionalInterface
interface QQ{
	int bos(int a);
}

Lambda的特征

 可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。

 可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号。

 可选的大括号:如果主体包含了一个语句,就不需要使用大括号。

 可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定明表

​ 达式返回了一个数值。

​ 泛型方法 要写数据类型


方法引用

当方法中只有一条语句时 才可以使用

Stream

什么是Stream ?

​ Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的

高阶抽象。 

​ Stream 不是集合元素,它不是数据结构并不保存数据,它是有关算法和计算的,它更像一个高级版本

​ 的 Iterator。

​ 原始版本的 Iterator,用户只能显式地一个一个遍历元素并对其执行某些操作;高级版本的 Stream,

​ 用户只要给出需要对其包含的元素执行什么操作,比如 “过滤掉长度大于 10 的字符串”、“获取每个

​ 字符串的首字母”等,Stream 会隐式地在内部进行遍历,做出相应的数据转换。

​ Stream 就如同一个迭代器(Iterator),单向,不可往复,数据只能遍历一次,遍历过一次后即用尽

​ 了,就好比流水从面前流过,一去不复返。

使用stream

流操作分为4大类

初始**/转换(init)、媒介(Intermediate)、末端(Terminal)、短路(Short-circuiting)**

生成流,Java中的Stream的所有操作都是针对流的,所以,使用Stream必须要得到

Stream对象

 Collection.stream() − 为集合创建串行流

 Collection.parallelStream() − 为集合创建并行流。

 Arrays.stream(T array) 或者 Stream.of() -自定义创建流数据

1**、初始化一个流:**

​ Stream stream = Stream.of(“a”, “b”, “c”);

2**、数组转换为一个流:**

​ String [] strArray = new String[] {“a”, “b”, “c”};

​ stream = Stream.of(strArray);

​ stream = Arrays.stream(strArray);

3**、集合对象转换为一个流:**

​ List list = Arrays.asList(strArray);

​ stream = list.stream();

Date-Time

LocalDate、LocalTime 、 LocalDateTime

该包的API提供了大量相关的方法,这些方法一般有一致的方法前缀,代表着特定的功能

of:静态工厂方法,用于自定义日期。

parse:静态工厂方法,关注于解析。

get:获取某些东西的值。

is:检查某些东西的是否是true。

with:不可变的setter方法。

plus:加一些量到某个对象。

minus:从某个对象减去一些量。

to:转换到另一个类型。

at:把这个对象与另一个对象组合起来,例如: date.atTime(time)。

你可能感兴趣的:(java)