一、Java8
1.Lambda表达式
Lambda是一个匿名函数,我们可以把Lambda表达式理解为是一段可以传递的代码(将代码像数据一样进行传递)。可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格,使Java的语言表达能力得到了提升。
示例
public class Test1 {
public static void main(String[] args) {
MathOperation mathOperation=(a,b)->a + b;
System.out.println(mathOperation.getSum(1,2));
}
}
interface MathOperation {
int getSum(int a, int b);
}
上面的例子中,我们创建了一个函数式接口 MathOperation
,它定义了一个接受两个整数参数并返回他们和的结果的操作。然后,我们使用Lambda表达式实现了该接口,计算两个数的和并输出结果。请注意,Lambda表达式的参数类型可以根据上下文推断,因此不需要显式声明参数类型。
2.函数式接口
如第一点的例子的 MathOperation,他的内部只有一个抽象方法,这种只有一个抽象方法的我们就称之为函数式接口
3.Stream流操作
Java 8引入的Stream API 是一种用于处理集合数据的新方式。它提供了一种声明性的、函数式的风格,允许对集合进行复杂的操作,例如过滤、映射、排序等,而无需显式地使用迭代器或循环。
public class Test2 {
public static void main(String[] args) {
List<String> list = Arrays.asList("apple", "xiaomi", "oppo");
Stream<String> stream = list.stream();//获取流对象
List<String> o = stream.filter(s -> s.contains("o"))//中间操作过滤
.map(String::toUpperCase)//把每个转大写
.sorted()//排序
.collect(Collectors.toList());//收集
System.out.println(o);
}
}
常见方法有:
中间操作:
1.filter(element -> condition)根据指定条件过滤元素
2.map(element -> transform(element))对每个元素执行指定的操作
3.flatMap(element -> Stream.of(transform(element)))将多个流合并为一个流
4.distinct() 去除流中重复元素
5.sorted() 排序
6.peek(element -> action(element))对每个元素执行操作并返回一个新的流。
终端操作:
1.forEach(element -> action(element))对流中的每个元素执行指定的操作。
2.collect()将流收集成指定的集合
3.reduce((result, element) -> combine(result, element))将流中的元素进行归约操作,如求和、求积等。
4.count() 返回流中元素数量
5.anyMatch(element -> condition)检查流中是否至少有一个元素满足指定条件。
6.allMatch(element -> condition)检查流中是否所有元素满足指定条件。
7.noneMatch(element -> condition)检查流中是否没有元素满足指定条件。
8.findFirst() 返回流中第一个元素
并行流和串行流
并行流是一种并发处理元素的流。它利用多线程同时处理元素,将数据集划分为多个子集,各个子集并行处理。串行流是一种按顺序处理元素的流。它在单线程环境下顺序执行,每个元素依次经过所有的中间操作和终端操作。
他们其实都是stream的流操作,只是在获取流对象时使用了不同的API
-
串行流: 使用
stream()
方法创建。 -
并行流: 使用
parallelStream()
方法创建。
使用串行流和并行流的选择取决于数据集的大小、处理任务的复杂性以及可用的系统资源。在一些情况下,并行流可以提供更好的性能,但并不是在所有情况下都是最佳选择
4.接口中的默认方法与静态方法
我创建了一个接口,内容如下:
public interface Test3 {
default void method1(){
System.out.println("我是接口的默认方法1");
}
static void method2(){
System.out.println("我是接口的静态方法");
}
void method3();
abstract void method4();
}
然后去实现这接口,
可以看到method3()和method()4是必须实现的,而method()1可以也可以重写,method2()这个静态方法则是不可以实现。静态方法只能通过接口名调用。
5.方法引用
方法引用是Java 8中引入的一种语法糖,用于简化Lambda表达式的写法。它允许你直接引用现有方法或构造方法,从而使代码更加简洁和易读。方法引用通常用于函数式接口的实现。在方法引用中,方法的引用被视为Lambda表达式的一种缩写。
1.静态方法引用: 引用静态方法。
// Lambda表达式写法 Function<Integer, String> lambdaFunction = x -> String.valueOf(x); // 方法引用写法 Function<Integer, String> methodReference = String::valueOf;他的的作用都是创建一个函数式接口的实例,它表示这是一个接受一个
Integer
类型参数并返回一个String
类型结果的函数式接口
2.实例方法引用: 引用特定对象的实例方法。
// Lambda表达式
BiPredicate<String, String> lambdaPredicate = (x, y) -> x.equals(y);// 方法引用
BiPredicate<String, String> methodReference = String::equals;
3.对象方法引用: 引用任意对象的实例方法。
List<String> list = Arrays.asList("a", "b", "c");
// Lambda表达式
list.forEach(s -> System.out.println(s));// 方法引用
list.forEach(System.out::println);
4.构造方法引用: 引用构造方法。
// Lambda表达式
Supplier<List<String>> lambdaSupplier = () -> new ArrayList<>();// 方法引用
Supplier<List<String>> methodReference = ArrayList::new;
6.新的日期和时间 API:
Java 8引入了新的时间和日期API,它是java.time
包的一部分。这个API解决了旧的java.util.Date
和java.util.Calendar
类存在的一些问题,提供了更为灵活、易用和线程安全的时间处理方式。
他有以下特点
不可变性(Immutability): 所有的类都是不可变的,这意味着一旦创建了一个实例,就无法修改它的值。这有助于线程安全和避免由于修改引起的副作用。
时区支持: 新的API提供了更好的时区支持,包括对不同时区的转换和计算。
新的日期和时间类: 包括
LocalDate
(日期)、LocalTime
(时间)、LocalDateTime
(日期和时间)、Instant
(时间戳)、ZonedDateTime
(带时区的日期和时间)等。持续时间和周期: 引入了
Duration
(持续时间)和Period
(周期)类,用于处理时间间隔和日期之间的差异。格式化和解析: 新的API提供了强大的格式化和解析功能,可以轻松地将日期和时间对象转换为字符串,反之亦然。
新的时钟和时区API: 提供了
Clock
类,用于获取当前时间,并支持时区设置。
// 获取当前日期
LocalDate currentDate = LocalDate.now();
System.out.println("Current Date: " + currentDate);
// 获取当前时间
LocalTime currentTime = LocalTime.now();
System.out.println("Current Time: " + currentTime);
// 获取当前日期和时间
LocalDateTime currentDateTime = LocalDateTime.now();
System.out.println("Current Date and Time: " + currentDateTime);
// 格式化日期
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String formattedDateTime = currentDateTime.format(formatter);
System.out.println("Formatted Date and Time: " + formattedDateTime);
7.新的重复注解特性: 允许在同一个元素上多次使用相同的注解。
@RepeatedAnnotation("first")
@RepeatedAnnotation("second")
public void myMethod() {
// Method implementation
}