桂林必去五个景点,桂林网站优化注意事项,公司网站建设 阿里,网站营销 优势Lambda表达式
Lambda表达式规则 Lambda表达式可以看作是一段可以传递的代码#xff0c; Lambda表达式只能用于函数式接口#xff0c;而函数式接口只有一个抽象方法#xff0c;所以可以省略方法名#xff0c;参数类型等 Lambda格式#xff1a;#xff08;形参列表…Lambda表达式
Lambda表达式规则 Lambda表达式可以看作是一段可以传递的代码 Lambda表达式只能用于函数式接口而函数式接口只有一个抽象方法所以可以省略方法名参数类型等 Lambda格式形参列表 - Lambda体 ; 在java中Lambda表达式本质是函数式接口的实现 Runnable runnable () - System.out.println(执行任务) ;形参列表是接口中的抽象方法的形参列表Lambda体 是重写的抽象方法的方法体 Lambda语法 形参列表 中 参数类型可以省略如果只有一个参数小括号可以省略lambda体如果只有一行语句return和 {} 都可以省略
java常见的函数式接口可以根据自己的业务需求重新这些方法简化代码 Consumer消费型接口有参数无返回对参数进行某种操作 void accept(T t);Supplier供给型接口无参有返回返回某个对象 T get();Function函数型接口有参有返回对 T类型的参数进行操作返回 R类型的结果 R apply(T t);private static void extracted() {// FunctionT, R T为入参R为返回结果FunctionInteger,String function (in)-{return in123;};String apply function.apply(12);System.out.println(apply); //12123}Predicate断定型接口有参有返回输入参数T返回boolean值用于判断对象是否满足某个条件 boolean test(T t);其他函数式接口 BiConsumer功能和Consumer类似只是多一个参数BiPredicate功能和Predicate类似同样只是多了一个参数BiFunction功能和Function类似同样只是多了一个参数IntFunction、LongFunction、DobleFunction、ToIntFunction、ToLongFunction、ToDobleFunction 返回对应类型的数据
方法引用 当要传递给Lambda体的操作已经有实现的方法了可以使用方法引用 方法引用是对Lambda的进一步简化本质上就是Lambda表达式而 Lambda 是函数式接口的实例所以方法引用也是函数式接口的实例 语法为 类对象: : 方法名 方法引用 不需要方法的参数调用可分为三种情况 情况1对象 : : 非静态方法 情况2类 : : 非静态方法 在面向对象oop中是不允许的 情况3类 : : 静态方法情况1和情况2 方法引用的要求接口中的抽象方法的形参列表和返回值类型与方法引用的方法的形参列表和返回值类型完全相同
如下三种写法从直接new到方法引用代码的逻辑是完全一致的 private static void extracted1() {ConsumerString consumer new ConsumerString() {Overridepublic void accept(String s) {System.out.println(s);}};consumer.accept(写法1);}private static void extracted2() {ConsumerString consumer (s)-System.out.println(s);consumer.accept(写法2);}private static void extracted3() {//方法引用是对Lambda的进一步简化用来替换Lambda表达式因为System.out对象的println方法已经实现过了所以只需要直接调用就好了不需要重新实现//接口中的抽象方法的形参列表和返回值类型与方法引用的方法的形参列表和返回值类型完全相同如下参数都是一个字符串返回值都是void所以可以使用参数引用ConsumerString consumer System.out::println;consumer.accept(写法3);}构造器引用
类似与方法应用参数列表和返回值匹配就可以使用构造器引用因为构造器也是方法
类名new同理数组引用可以把数组看作一个类 private static void extracted5() {//下面两种写法都是创建一个 10个长的数组FunctionInteger,String[] function in- new String[in];String[] apply function.apply(10);FunctionInteger,String[] function1 String[]::new;String[] apply1 function1.apply(10);}stream
Java8 Stream
与 java.io 包里的 InputStream 和 OutputStream 是完全不同的概念。Java 8 中的 Stream 是对集合Collection对象功能的增强使用的是函数式编程模式它可以被用来对集合进行链状流式的操作专注于对集合对象进行各种非常便利、高效的聚合操作aggregate operation或者大批量数据操作 (bulk data operation)。Stream 不会存储数据也不会改变原对象每次操作都回返回一个新的streamStream 分为顺序流和并行流
一个流式处理可以分为三个部分
获取一个数据源→ 数据转换 → 执行操作获取想要的结果每次转换原有 Stream 对象不改变返回一个新的 Stream 对象可以有多次转换这就允许对其操作可以像链条一样排列变成一个管道。
转换成流
创建流的五种方式 通过 stream 方法把 集合 或数组 Arrays.stream()转换为流通过 Stream.of 方法直接传入多个元素构成一个流 例如Stream.of(10,20,30); 通过 IntStream 或 DoubleStream 构造基本类型的流。 例如IntStream.of(10,20,30); 创建无限流无限流的使用较少 通过 Stream.iterate 方法使用迭代的方式构造一个无限流然后使用 limit 限制流元素个数通过 Stream.generate 方法从外部传入一个提供元素的 供应商来构造无限流然后使用 limit 限制流元素个数
中间操作 过滤 filter根据条件过滤 limit操作也类似于SQL语句中的LIMIT关键字不过相对功能较弱limit返回包含前n个元素的流当集合大小小于n时则返回实际长度 skip操作与limit操作相反如同其字面意思一样是跳过前n个元素 distinct操作类似于我们在写SQL语句时添加的DISTINCT关键字用于去重处理 public class StreamEntity {private String name;private Integer age;private String high;
}public static void test() {//向集合中初始化了一些 StreamEntity 对象以供操作ListStreamEntity list getList();//过滤 年龄大于25的对象 后续使用lambda打印list.stream().filter(a - a.getAge() 25).forEach(a - System.out.println(a));//截取 集合中前两条数据 后续使用方法引用打印list.stream().limit(2).forEach(System.out::println);//跳过前两条数据list.stream().skip(2).forEach(System.out::println);//筛选,通过对象的hashcode和equals对集合中的数据进行去重list.stream().distinct().forEach(System.out::println);}映射包含两类映射操作map和flatMap就像sql可以仅输出我们需要的字段数据一样 map可以在filter筛选的基础之上通过map将实体映射成为我们需要的字符串flatMap与map的区别在于 flatMap是将一个流中的每个值都转成一个个流流中的元素也有可能是流然后再将这些流扁平化成为一个流有点类似与集合的addAll调用addAll向集合中添加集合会把集合中的每一个参数都加到目标集合而不是把集合对象加入到目标集合中 //将元素中转换为其他形式或者提取信息 如下提取对象中的年龄并加1list.stream().map(a-a.getAge()1).forEach(System.out::println);//flatMapListListStreamEntity res new ArrayList();res.add(list);res.add(list);//这里已经把集合中的集合全部拆出来了StreamString objectStream res.stream().flatMap(a - a.stream().map(b-b.getName()));objectStream.forEach(System.out::println);排序 sorted进行自然排序如果排序的对象没有实现 Comparator 也就是没有排序规则会报错 sorted(Comparator? super T comparator)如果排序的对象没有实现 Comparator 也可以传入一个比较器 //按照年龄自然排序
list.stream().map(a-a.getAge()).sorted().forEach(System.out::println);//传入比较器
list.stream().sorted((a, b) - a.getAge() - b.getAge()).forEach(System.out::println);
//使用方法引用为
list.stream().sorted(Comparator.comparingInt(StreamEntity::getAge)).forEach(System.out::println);
终止操作终端操作 不调用终止操作中间操作是不会执行的调用终止操作产生结果后stream就不能再被使用了 查找 allMatch用于检测是否全部都满足指定的参数行为如果全部满足则返回trueanyMatch则是检测是否存在一个或多个满足指定的参数行为如果满足则返回truenoneMatch用于检测是否不存在满足指定行为的元素如果不存在则返回truefindFirst用于返回满足条件的第一个元素findFirst不携带参数具体的查找条件可以通过filter设置findAny相对于findFirst的区别在于findAny不一定返回第一个而是返回任意一个 //
boolean b list.stream().map(a - a.getAge()).allMatch(a - a 30);
// 用于返回满足条件的第一个元素查找条件可以通过filter设置
OptionalInteger first list.stream().map(a - a.getAge()).filter(a - a 30).findFirst();
Integer integer first.get()count 返回流中的元素个数max 返回流中的最大值min 返回流中的最小值forEach 内部迭代 long count list.stream().count();
//根据自定义比较器求最大
StreamEntity s1 list.stream().max((a, b) - a.getAge() - b.getAge()).get();
//根据自定义比较器求最小
StreamEntity s2 list.stream().min((a, b) - a.getAge() - b.getAge()).get();
//迭代
list.stream().forEach(a- System.out.println(a.getAge()1));归约 reduce 可以将流中的元素反复结合起来得到一个值 // 获取年龄的总和
Integer s1 list.stream().map(a - a.getAge()).reduce((b, d) - b d).get();
// reduce 的一个参数是初始值
Integer s2 list.stream().map(a - a.getAge()).reduce(0, (b, d) - b d);收集 归约 收集器也提供了相应的归约操作collect 收集需要用过Collectors中返回的Collector将结果收集到指定的结果集中例如 list、map、set 等 //转换为 list
ListStreamEntity collect list.stream().collect(Collectors.toList());
//转化为 map
MapInteger, StreamEntity collect1 list.stream().collect(Collectors.toMap(a - a.getAge(), a - a));
//转换为 set
SetString collect2 list.stream().map(a - a.getName()).collect(Collectors.toSet()); 分组在数据库操作中我们可以通过GROUP BY关键字对查询到的数据进行分组java8的流式处理也为我们提供了这样的功能Collectors.groupingBy来操作集合 分区可以看做是分组的一种特殊情况在分区中key只有两种情况true或false目的是将待分区集合按照条件一分为二
Optional
参考 Google 的 Guava用于尽量避免空指针异常Optional 是一个容器类用于保存任意类型的值代表这个值存在或者保存null代表值不存在
常见方法 创建Optional 对象 empty() 创建空的实例 ofT t,t不能为空 ofNullableT t 获取Optional 对象的值 get方法会在值为null的时候抛出异常可以用ifPresent()方法验证值是否为空orElse()方法可以在创建实例时就指定返回的默认值