1,lambda表达式简介
1.lambda表达式可以用非常少的代码实现抽象方法。lambda表达式不能独立执行,因此必须实现函数式接口,并且会返回一个函数式接口的对象。lambda表达式的语法非常特殊。
lambda表达式的语法非常抽象,并且有着非常强大的自动化功能,如自动识别泛型、自动数据类型转换等
() -> {}
// 方法 按照 执行
2.lambda 表达式实现无参抽象方法
interface SayHi{
String say();
}
public class NoParamDemo {
public static void main(String[] args) {
//使用匿名内部类补全方法体
SayHi sh1=new SayHi() {
public String say() {
return "这是匿名内部类";
}
};
System.out.println(sh1.say());
//使用lambda表达式补全方法体
SayHi h1=()-> {
return "这是匿名内部类";
};
System.out.println(h1.say());
}
}
3,lambda 表达式实现有参抽象方法
interface AddInt{
int add(int a,int b);
}
public class ParamDemo {
static int ad(int x,int y) {
return x + y;
}
public static void main(String[] args) {
//使用匿名内部类来补全方法体
AddInt ai1=new AddInt() {
public int add(int a,int b) {
return a + b;
}
};
System.out.println("匿名内部类:"+ai1.add(3, 5));
//使用lambda表达式来补全方法体
AddInt ai2=(a,b)-> {
return a + b;
};
System.out.println("lambda表达式:"+ai2.add(3, 5));
//使用方法的引用补全方法体
AddInt ai3=ParamDemo::ad;
System.out.println("方法的引用:"+ai3.add(3, 5));
}
}
4.lambda 表达式使用代码块
当函数式接口的抽象方法需要实现复杂逻辑而不是返回一个简单的表达式的话,铁需要在 lmbd来式中使用代码块,lambda 表达式会自动判断返回值类型是否符合抽像方式的定义。
interface CheckGrade{
String check(int grade);
}
public class GradeDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
CheckGrade g=(n)->{
if(n>=90&&n<=100) {
return"成绩为优";
}else if(n>=80&&n<90) {
return"成绩为良";
}else if(n>=60&&n<80) {
return"成绩为中";
}else if(n>=0&&n<60) {
return"成绩为差";
}else {
return"成绩无效";
}
};
System.out.println(g.check(89));
}
}
类方法
序号 方法 & 描述
1 static <T> Optional<T> empty()
返回空的 Optional 实例。
2 boolean equals(Object obj)
判断其他对象是否等于 Optional。
3 Optional<T> filter(Predicate<? super <T> predicate)
如果值存在,并且这个值匹配给定的 predicate,返回一个Optional用以描述这个值,否则返回一个空的Optional。
4 <U> Optional<U> flatMap(Function<? super T,Optional<U>> mapper)
如果值存在,返回基于Optional包含的映射方法的值,否则返回一个空的Optional
5 T get()
如果在这个Optional中包含这个值,返回值,否则抛出异常:NoSuchElementException
6 int hashCode()
返回存在值的哈希码,如果值不存在 返回 0。
7 void ifPresent(Consumer<? super T> consumer)
如果值存在则使用该值调用 consumer , 否则不做任何事情。
8 boolean isPresent()
如果值存在则方法会返回true,否则返回 false。
9 <U>Optional<U> map(Function<? super T,? extends U> mapper)
如果有值,则对其执行调用映射函数得到返回值。如果返回值不为 null,则创建包含映射返回值的Optional作为map方法返回值,否则返回空Optional。
10 static <T> Optional<T> of(T value)
返回一个指定非null值的Optional。
11 static <T> Optional<T> ofNullable(T value)
如果为非空,返回 Optional 描述的指定值,否则返回空的 Optional。
12 T orElse(T other)
如果存在该值,返回值, 否则返回 other。
13 T orElseGet(Supplier<? extends T> other)
如果存在该值,返回值, 否则触发 other,并返回 other 调用的结果。
14 <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier)
如果存在该值,返回包含的值,否则抛出由 Supplier 继承的异常
15 String toString()
返回一个Optional的非空字符串,用来调试
5.Stream接口简介
Stream(流)是一个来自数据源的元素队列并支持聚合操作
元素是特定类型的对象,形成一个队列。 Java中的Stream并不会存储元素,而是按需计算。
数据源 流的来源。 可以是集合,数组,I/O channel, 产生器generator 等。
聚合操作 类似SQL语句一样的操作, 比如filter, map, reduce, find, match, sorted等。
和以前的Collection操作不同, Stream操作还有两个基础的特征:
Pipelining: 中间操作都会返回流对象本身。 这样多个操作可以串联成一个管道, 如同流式风格(fluent style)。 这样做可以对操作进行优化, 比如延迟执行(laziness)和短路( short-circuiting)。
内部迭代: 以前对集合遍历都是通过Iterator或者For-Each的方式, 显式的在集合外部进行迭代, 这叫做外部迭代。 Stream提供了内部迭代的方式, 通过访问者模式(Visitor)实现。
import java.text.SimpleDateFormat;
import java.util.Date;
interface InstanceMethodInterface{
String method(Date date);
}
public class InstanceMethodDemo {
public String format(Date date) {
//创建日期格式化对象,并指定日期格式化
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
return sdf.format(date);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
InstanceMethodDemo demo=new InstanceMethodDemo();
InstanceMethodInterface im=demo::format;
Date date=new Date();
System.out.println("默认格式:"+date);
System.out.println("接口输出的格式:"+im.method(date));
}
}
interface ConIn{
ConDemo action(int a);
}
public class ConDemo {
public ConDemo() {
System.out.print("无参构造方法");
}
public ConDemo(int a) {
System.out.print("有参构造方法"+a);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
ConIn ci1=ConDemo::new;
ci1.action(5);
}
}