/

  • Created by Manager on 2021/4/1.
  • Java 8 新特性
  • lambda表达式
  • StreamAPI
  • 新日期
  • 新注解
    */

视频连接
1https://www.bilibili.com/video/BV1ut411g7E9
2https://www.bilibili.com/video/BV164411E7Ny?from=search&seid=476315511879331377

public interface TestInterface {//语法糖void testMethod();
}
class Godness {private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}public Godness(String name) {this.name = name;}public Godness() {}
}
class myclass implements TestInterface {public myclass() {}public myclass(String name) {this.name = name;}public myclass(Optional<Godness> godness) {this.godness = godness;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Optional<Godness> getGodness() {return godness;}public void setGodness(Optional<Godness> godness) {this.godness = godness;}//    Optionalprivate Optional<Godness> godness = Optional.empty();private String name;private int age;public Status getStatus() {return status;}public void setStatus(Status status) {this.status = status;}private Status status;public int getAge() {return age;}public void setAge(int age) {this.age = age;}public enum Status {Free,BUSY,VOCATION}@Overridepublic void testMethod() {System.out.print("aaaaaaaaaaaaaaaa");}void doTest() {//创建接口对象实现类TestInterface test = new myclass();test.testMethod();//匿名内部类TestInterface test2_ = new TestInterface() {@Overridepublic void testMethod() {System.out.print("bbbbb");}};test2_.testMethod();//lambda   接口的实现类的  具体对象  test2=====================//{方法体中 只有一句 可省略}//->  lambda操作符   goes to//() 接口抽象方法  形参列表//右边  接口抽象方法  方法体//无参数  无返回值TestInterface test3 = () -> System.out.print("lambda");test3.testMethod();//一个参数  无返回值  类型推断  int可省//参数只有一个 ()可省TestInterface3 test3_ = (x, y) -> x;test3_.testMethod(1, 2);//多参数 多代码(){}  不可省TestInterface3 t3 = (x, y) -> {return 2;};//只有return  return 可省TestInterface3 t3_ = (x, y) -> 20;int a = t3_.testMethod(1, 2);}//lambda表达式使用的接口只能有一个抽象方法 ====函数式接口//@FunctionalInterface  限定===》函数式接口  只有一个抽象函数//一定是函数式接口@FunctionalInterfaceinterface TestInterface3 {int testMethod(int num1, int num2);}void dofour() {String str = getString("aa", x -> x.toUpperCase());op(100L, 100L, (x, y) -> x * y);
//==========================//四个经常用内置的函数式 接口
//1  消费型接口  Consumer<T>   void  accept(T t)传递参数  无返回值
//2  供给型接口  Supplier<T>   T get();   无参数  返回 T
//3  函数型接口  Function<T,R>  R apply(T t) T参数  返回 R
//4  断言型接口  Predicate<T>  boolean  test(T t)T参数  返回 boolean
//        lambda中引用的参数  必须是常量fina  不可修改  默认加了   闭包中引用局部变量默认都是常量Consumer<Double> consumer = x -> System.out.print("aaaaaaaaaaa" + x);consumer.accept(1000.0);Supplier<Integer> sup = () -> (int) (Math.random() * 100);//返回100内的随机数Integer in = sup.get();Function<String, String> fun1 = x -> x.trim();String res = fun1.apply("1111");Function<String, Integer> fun = x -> Integer.parseInt(x);Integer res2 = fun.apply("1111");Predicate<String> pre = x -> x.length() > 9;Boolean bo = pre.test("101111");//方法引用三种使用情况=============================//lambda体中的内容有方法已经实现//方法体的实现 引用指向一个已经实现的方法//前面的 函数式接口 的 参数列表(数量  类型) 和返回值 和具体的实现方法体 的参数 和返回值  一致//        可以使用方法引用//1 对象:: 实例方法名  非静态Consumer<String> con = x -> System.out.println("aaaaaaaaaaa" + x);con.accept("1000.0");Consumer<String> con2 = System.out::println;con2.accept("aaaaaaaaaaa" + "1000.0");//2 类 :: 静态方法名Comparator<Integer> com = (x, y) -> Integer.compare(x, y);int a = com.compare(10, 20);Comparator<Integer> com2 = Integer::compare;int a2 = com2.compare(10, 20);//3 类 :: 实例方法名         x作为调用者   y为参数BiPredicate<String, String> bp = (x, y) -> x.equals(y);bp.test("nihao", "你好");BiPredicate<String, String> bp2 = String::equals;bp2.test("nihao", "你好");
//================================
//        构造器引用  className::new
//        get()无参数  对应无参数构造器
//        get() 一个参数对应构造器一个参数Supplier<myclass> supplier = () -> new myclass();Supplier<myclass> supplier2 = myclass::new;myclass mc = supplier2.get();Supplier<ArrayList> supplier3 = ArrayList::new;List<String> list = supplier3.get();Function<String, myclass> ff1 = x -> new myclass(x);ff1.apply("wn1");Function<String, myclass> ff2 = myclass::new;myclass my = ff2.apply("wn2");
//        数组引用 Type::newFunction<Integer, String[]> f1 = x -> new String[x];String[] strs = f1.apply(10);Function<Integer, String[]> f2 = String[]::new;String[] strs2 = f2.apply(10);
//      线程实例化  runnable  无参无返回值Thread t = new Thread(()->{});t.start();
//  Stream ====================
// 1原数据源(集合 数组) 不变 2转化成流Stream  3流水线式的中间操作  4终止操作 生成新的数据源(集合 数组)
//        1 创建Stream 2 中间操作  3终止操作
//        1  Collection系列集合提供的  stream()串行流  或者 parallelStream()并行流List<String> list_s = new ArrayList<>();list_s.add("11");list_s.add("22");list_s.add("33");list_s.add("44");list_s.removeIf(x -> x.length() > 4);//满足条件则删除Stream<String> st = list_s.stream();
//      2 Stream中的静态方法Stream.of()  数组也可以Stream<String> st1 = Stream.of("a", "b");Stream<String> st11 = Stream.of(strs);//       3  Arrays  中静态方法Arrays.stream()获取数组流Stream<String> st2 = Arrays.stream(strs);
//        4 创建无限流
//        迭代Stream<Integer> st3 = Stream.iterate(0, x -> x + 2);st3.limit(5).forEach(System.out::println);
//      生成Stream<Double> st4 = Stream.generate(() -> Math.random());
//      一 筛选与切片 ===========
//     1  排除 filter(Predicate<T>)//        中间操作   不执行任何处理且没有任何结果
//        内部迭代 Stream API完成迭代Stream<String> new1 = st.filter(x -> x.equals("11"));
//        终止才 执行全部内容且有结果   叫做 惰性求值new1.forEach(System.out::println);
//        2  limit()  截断流 使元素不超过指定数量
//        只执行 目标数据操作   不执行其他  短路 2 只执行俩
//        3 skip(n)  跳过元素 扔掉前n个不要 执行后面的,总数不足n返回一个空流
//        4 distinct  筛选   通过流生成元素的 重写  hashCode()和equals()去除重复元素new1.limit(1).skip(1).distinct().forEach(System.out::println);
//        二  映射 =================
//        map  接受lambda 将元素转换成其他形式或者提取信息
//        将流中每一个元素 用在传递的函数上 生成新流List<String> list2 = Arrays.asList("aa", "bb", "cc", "dd", "ee");list2.stream().map(x -> x.toUpperCase()).forEach(System.out::println);List<myclass> mylist = new ArrayList<>();mylist.stream().map(myclass::getName);//提取信息
//        flatMap  接收一个函数作为参数,将流中每一个值都转换为另一个流
//        然后把所有流都连城一个流
//        list2.stream().map(x -> filterCharacter(x));Stream<Stream<Character>> st_ch = list2.stream().map(myclass::filterCharacter);st_ch.forEach(x -> x.forEach(System.out::println));
//        flatMap    map{{aaa},{bbb},{ccc}} flatMap{aaabbbccc}添加子流中元素所有流都连城一个流 最后变一个
//        类似 list中 add   addAllStream<Character> st_ch2 = list2.stream().flatMap(myclass::filterCharacter);
//        三  排序======================
//        sorted(Comparable) --自然排序  由小到大  字母顺序拍list2.stream().sorted();
//        sorted(Comparator com)--定制排序   指定条件 然后排序mylist.stream().sorted((my1, my2) -> {if (my1.getAge() == my2.getAge()) {
//                年龄相同按名字排return my1.getName().compareTo(my2.getName());} else {
//                不相同安年龄排   年龄降序my2.getAge()- my1.getAge()return (my1.getAge() + "").compareTo((my2.getAge() + ""));}});
//        终止操作==============================
//        查找与匹配
//        allMatch --检查是否匹配所有元素
//        全部都是  返回truemylist.stream().allMatch(x -> x.getStatus().equals(Status.BUSY));
//        anyMatch--检查是否至少匹配一个元素
//        有一个就可以 truemylist.stream().anyMatch(x -> x.getStatus().equals(Status.BUSY));
//        noneMatch--检查是否没有匹配所有元素
//        全部都不是  返回truemylist.stream().noneMatch(x -> x.getStatus().equals(Status.VOCATION));
//        findFirst--返回第一个元素   Optional 避免为空Optional<myclass> myfirst = mylist.stream().sorted((my1, my2) -> Integer.compare(my1.getAge(), my2.getAge())).findFirst();myclass myf = myfirst.get();
//        findAndy--返回当前流中任意元素Optional<myclass> myAny = mylist.stream().filter(x -> x.getStatus().equals(Status.Free)).findAny();
//        count--返回流中元素中和long count = mylist.stream().count();
//        max--返回流中最大值    类似  sorted(Comparator com)--定制排序   指定条件 然后排序Optional<myclass> myMax = mylist.stream().max((my1, my2) -> Integer.compare(my1.getAge(), my2.getAge()));
//        min--返回流中最小值Optional<myclass> myMin = mylist.stream().min((my1, my2) -> Integer.compare(my1.getAge(), my2.getAge()));
//        mylist.stream().map(myclass::getAge)
//                       .min((x,y) ->Integer.compare(x,y))Optional<Integer> opInt = mylist.stream().map(myclass::getAge).min(Integer::compare);int opi = opInt.get();
//   规约  reduce     将流中元素反复结合起来得到一个值List<Integer> list3 = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
//        0为起始值 1作为Y  0+ 1  然后  作为x     2作为y  继续到底Integer sum = list3.stream().reduce(0, (x, y) -> x + y);
//        mylist   中年龄总和Integer allAge = mylist.stream().map(myclass::getAge).reduce(0, (x, y) -> x + y);
//        没有起始值  可能为空  所以返回OptionalOptional<Integer> allAge2 = mylist.stream().map(myclass::getAge).reduce((x, y) -> x + y);Optional<Integer> allAge3 = mylist.stream().map(myclass::getAge).reduce(Integer::sum);allAge3.get();
//        收集   collect   将流转换为其他形式 接受一个Collector接口 给Stream中元素做汇总
//        提取 名字 添加到集合中       collectors里面静态方法  Collectors.toList()List<Integer> newList = mylist.stream().map(myclass::getAge).collect(Collectors.toList());newList.forEach(System.out::println);
//        set中Set<String> newset = mylist.stream().map(myclass::getName).collect(Collectors.toSet());
//        生成指定的 类型HashSet<String> newHashSet = mylist.stream().map(myclass::getName).collect(Collectors.toCollection(HashSet::new));
//        总数long count2 = mylist.stream().collect(Collectors.counting());
//        平均值Double aver = mylist.stream().collect(Collectors.averagingDouble(myclass::getAge));
//        总和Double summ = mylist.stream().collect(Collectors.summingDouble(myclass::getAge));
//        Double summ2 = mylist.stream().collect(Collectors.summingDouble(new ToDoubleFunction<myclass>() {
//            @Override
//            public double applyAsDouble(myclass value) {
//                return value.getAge();
//            }
//        }));Double summ3 = mylist.stream().map(myclass::getAge).collect(Collectors.summingDouble(x -> x));
//        Double summ4 = mylist.stream().map(myclass::getAge).collect(Collectors.summingDouble
//                (new ToDoubleFunction<Integer>() {
//                    @Override
//                    public double applyAsDouble(Integer value) {
//                        return value;
//                    }
//                }));
//        最大值    orted(Comparator com)--定制排序    max   min   maxBy  minByOptional<myclass> myMax_ = mylist.stream().max((my1, my2) -> Integer.compare(my1.getAge(), my2.getAge()));Optional<myclass> myMax2 = mylist.stream().collect(Collectors.maxBy((x, y) -> Integer.compare(x.getAge(), y.getAge())));
//        最小值Optional<Integer> myMMin2 = mylist.stream().map(myclass::getAge).collect(Collectors.minBy(Integer::compare));
//         分组   安状态分组Map<Status, List<myclass>> map = mylist.stream().collect(Collectors.groupingBy(myclass::getStatus));
//        遍历map
//        多级分组Map<Status, Map<String, List<myclass>>> map2 = mylist.stream().collect(Collectors.groupingBy(myclass::getStatus,Collectors.groupingBy(x -> {if (x.getAge() <= 35) {return "青年";} else if (x.getAge() <= 50) {return "中年";} else {return "老年";}})));
//        分区   分为  true  false  俩区Map<Boolean, List<myclass>> map3 = mylist.stream().collect(Collectors.partitioningBy(x -> x.getAge() > 100));
//       另外一种方式获取DoubleSummaryStatistics ss = mylist.stream().collect(Collectors.summarizingDouble(myclass::getAge));ss.getSum();ss.getAverage();ss.getMax();
//     连接字符串String str4 = mylist.stream().map(myclass::getName).collect(Collectors.joining());//     连接字符串时加 ,String str5 = mylist.stream().map(myclass::getName).collect(Collectors.joining(","));
//     连接字符串时加 ,  头部加===  尾部加===String str6 = mylist.stream().map(myclass::getName).collect(Collectors.joining(",", "===", "==="));
//parallelStream  并行流
//        切换并行流parallel()     切换顺序流sequential()LongStream.rangeClosed(0, 100000000L).parallel().reduce(0, Long::sum);
//        Optional 类  避免空指针   快速锁定 null位置Optional<myclass> op = Optional.of(new myclass());myclass myop = op.get();
//        of不能为空  empty()为空  ofNullable()参数不为空 创建of  为空 创建空emptyop.isPresent();//是否包含值  booleanop.orElse(new myclass());//有值获取  没值 获取默认的new myclass()myclass my4 = op.orElseGet(() -> new myclass());//有值获取  没值 获取默认的 函数式接口中的 new myclass()Optional<String> name = op.map(myclass::getName);//有值 map处理  没有empty();//flatMap 里面 function接口返回值必须是optionalOptional<String> flatop = op.flatMap(e -> Optional.ofNullable(e.getName()));
//避免空指针   每次  if判断
//        Optional<myclass> op1 = Optional.ofNullable(null);Optional<Godness> gd = Optional.ofNullable(new Godness("andy"));Optional<myclass> op1 = Optional.ofNullable(new myclass(gd));op1.orElse(new myclass())//没有构造函数赋值 则是Optional empty.getGodness().orElse(new Godness("aa")).getName();
//========================
//        全新的时间日期 API     之前的 线程不安全
//        1 LocalDate LocalTime  LocalDateTime   人看的时间LocalDateTime ldt = LocalDateTime.now();LocalDateTime ldt2 = LocalDateTime.of(2021, 10, 19, 13, 22, 33);LocalDateTime ldt3 = ldt.plusYears(2);//加两年   新实例ldt.minusMonths(2);//减俩月ldt.getYear();//获取年ldt.getMonthValue();//获取月ldt.getDayOfMonth();//获取日ldt.getHour();//获取时ldt.getMinute();//获取分ldt.getSecond();//获取秒
//     2 Instant   时间戳  1970年1月1号00:00:00 -现在毫秒值Instant ins = Instant.now();//默认 UTC时区  跟中国差8  现在时间ins.toEpochMilli();   //毫秒OffsetDateTime ofd = ins.atOffset(ZoneOffset.ofHours(8));//偏移量运算Instant.ofEpochSecond(60);//1970年1月1号00:00:00 加 60秒
//      Duration  时间间隔Instant ins2 = Instant.now();Duration du = Duration.between(ins, ins2);du.getSeconds();du.toDays();LocalTime ldt4 = LocalTime.now();LocalTime ldt5 = LocalTime.now();Duration du2 = Duration.between(ldt4, ldt5);du2.toMillis();
//     Period  日期之间的间隔LocalDate ld = LocalDate.of(2015, 1, 1);LocalDate ld2 = LocalDate.now();Period pd = Period.between(ld, ld2);pd.getMonths();
//      TemporalAdjuster  时间矫正器LocalDateTime ldt6 = LocalDateTime.now();LocalDateTime ldt7 = ldt6.withDayOfMonth(10);//指定月为10月ldt6.with(TemporalAdjusters.next(DayOfWeek.MONDAY));//指定下一个周一
//自定义  下一个工作日ldt6.with(x -> {LocalDateTime l = (LocalDateTime) x;DayOfWeek day = l.getDayOfWeek();if (day.equals(DayOfWeek.FRIDAY)) {return l.plusDays(3);} else if (day.equals(DayOfWeek.SATURDAY)) {return l.plusDays(2);} else {return l.plusDays(1);}});
//        DateTimeFormatter   格式化时间日期LocalDateTime ldt8 = LocalDateTime.now();DateTimeFormatter df = DateTimeFormatter.ISO_DATE_TIME;String date = ldt8.format(df);
//        指定自己DateTimeFormatter df2 = DateTimeFormatter.ofPattern("yyyy年MM月DD日HH:MM:SS");String date2 = ldt8.format(df2);
//        字符串 to时间LocalDateTime strdate = LocalDateTime.parse(date2, df2);
//        时区                            指定时区LocalDateTime ldt9 = LocalDateTime.now(ZoneId.of("Asia/Shanghai"));ZonedDateTime zdt = ldt9.atZone(ZoneId.of("Asia/Shanghai"));
//}interface MyFun3<T, U, R> {public R getStr(T t1, U t2);//default  默认方法
// 1 类优先原则  优先选择父类的同名方法  后接口中
// 2 实现多个接口 有同名 同参数方法  实现类中要明确是那个接口的default String getName() {return "aaaa";}//        静态方法public static void show() {}}public static Stream<Character> filterCharacter(String str) {List<Character> list = new ArrayList<>();for (Character ch : str.toCharArray()) {list.add(ch);}return list.stream();}public String getString(String str, MyFun<String> myfun) {return myfun.getStr(str);}private void op(Long a, Long b, MyFun2<Long, Long, Long> mf) {mf.getStr(a, b);}
}
//函数式 接口 只有一个抽象方法
@FunctionalInterface
interface MyFun<T> {public T getStr(T t);
}
interface MyFun2<T, U, R> {public R getStr(T t1, U t2);
}**

Java 8 新特性 lambda表达式相关推荐

  1. Java 8 新特性Lambda 表达式

    Java 8 新特性Lambda 表达式 一.常用循环 二.匿名内部类 三.排序集合 四.循环打印对象 五.根据条件修改 六.排序 七.求和 八.统计方法 九.材料 一.常用循环 public cla ...

  2. 【Java】Java 8 新特性-----Lambda 表达式

    一.Lambda 表达式的主要改进点 Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性. Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中). 使用 ...

  3. java lambda表达式详解_Java8新特性Lambda表达式详解

    课程目标: 通过本课程的学习,详细掌握Java8新特性之Lambda表达式: 适用人群:有Java基础的开发人员: 课程概述:从Java 8出现以来lambda是最重要的特性之一,它可以让我们用简洁流 ...

  4. java新特性lambda表达式快速入门

    文章目录 序 常规写法 写法一:新建类并实现该接口 写法二:使用匿名函数 lambda写法 写法一:lambda常规写法 写法二:lambda简写 中场疑问 lambda的方法引用 写法一 写法二 练 ...

  5. Java8新特性----Lambda表达式详细探讨

    Java8新特性 Lambda表达式 入门演示 案例1 如何解决 cannot be cast to java.lang.Comparable问题? 案例2 优化方式一 : 策略设计模式 优化方式二: ...

  6. C++11新特性——λ(lambda)表达式详解

    C++11新特性--λ(lambda)表达式 C++11中引入了λ表达式,它可以用来定义一个内联(inline)的函数,作为一个本地的对象或者一个参数.有了λ表达式,我们可以很方便的使用stl标准库. ...

  7. java三目表达式_Java8新特性Lambda表达式

    1 Lambda表达式 对于很多计算机语言来说,Lambda表达式并不是陌生的语法格式,而对于Java而言,它的到来比较晚,直到Java8更新之后,Lambda表达式才正式出现在Java语法中.所以如 ...

  8. 【Java】jdk 1.8 新特性——Lambda表达式

    Lambda表达式 jdk 1.8 新加入的特性,简化了简单接口的实现 函数式接口 函数式中只有一个待实现的方法,可以使用@FunctionalInterface注解标注函数式接口.这个接口中只能有一 ...

  9. java thread lambda_Java8新特性--Lambda表达式

    从java8出现以来lambda是最重要的特性之一,它可以让我们用简洁流畅的代码完成一个功能. 很长一段时间java被吐槽是冗余和缺乏函数式编程能力的语言,随着函数式编程的流行java8种也引入了 这 ...

最新文章

  1. 网络爬虫-自动推送小说最新章节的小应用--懒惰的追小说者
  2. 双链表的创建,求长,插入,删除,打印,释放(循环和非循环)
  3. python003 一 Python起步、pyhthon运行方式、语法结构、python变量
  4. JSON.stringify()还可以这么用
  5. Ouroboros:一个可证明安全的PoS区块链协议 (共识介绍)
  6. python日期格式转换_python中有关时间日期格式转换问题
  7. Django------多表操作
  8. 计算机固态加机械硬盘,笔记本装固态硬盘和机械硬盘双硬盘
  9. 寻址方式(立即寻址、直接寻址、间接寻址、寄存器寻址、寄存器间接寻址)
  10. oracle01004,Oraclegoldengate的OGG-01004OGG-1296错误
  11. 因果效应,典型模型及wasserstein距离, BNN,CFR,SITE,NetDeconf
  12. 25款经典老芯片,认识5款以上的工程师证明你老了!
  13. PP-YOLOE论文解析
  14. 杨辉三角 c语言 二维数组
  15. 香港主要房产公司计划寻求监管机构对代币化房地产的许可
  16. 机器学习之K-Means
  17. 教你使用华为Ensp模拟器配置OSPF路由协议(二)
  18. 华为S2300系列交换机忘了console登录密码怎么办?
  19. python 字典的值可以为集合吗_Python 集合(Set)、字典(Dictionary)
  20. Android so导入表,Android so注入(inject)和Hook技术学习(二)——Got表hook之导入表hook...

热门文章

  1. 痛心!中兴通讯子公司研发工程师跳楼坠亡...
  2. 常说的LDO电路是啥?(简单版)
  3. poj1321棋盘问题
  4. 戴尔笔记本插入耳机没有反应
  5. LANDesk准入认证客户端 每次启动都丢失
  6. Excel 2003文档的密码忘了怎么办
  7. C++初阶学习————二叉树进阶(二叉搜索树)
  8. PostgreSQL 别名
  9. FPGA的NIOS-||的开发入门
  10. String类型——字符串