java8的基础知识有什么呢,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
1 . 通过行为参数化传递代码
a) Java8之前主要体现在策略模式(java.io.FilenameFilter)上,以前的时候我们通常需要传递一个匿名对象或者实例化具体类才能达到;
b) Java8可以将方法作为参数传递,这是在以前版本所不具有的,文中称这为一等函数,达到了与值(一等公民)的权利
2 . Lambda表达式
实现了把代码传给方法的方式,能够少些代码,而且可以实现解耦与代码复用,而且看起来很有条理,而且提供了并行以及自定义收集器,而且进行数据的统计的时候非常方便
1.匿名/函数/传递/简洁
2.函数式接口(@functionalinterface)/函数描述符(函数式接口的抽象方法的签名基本上就是Lambda表达式的签名,我们将这种方法叫做函数描述符,例如Runnable接口可以看作是一个什么也不接受什么也不返回的函数签名)。
3.环绕执行模式(try(BufferedReader br=new BufferedReader(new FileReader("data.txt")))){},这样只能够读取1行,如果2行,需要封装成个processFile((BufferedReader br)->br.readLine()+br.readLine())--->所以需要自定义一个功能函数接口并且自主抛出异常(return p.process(br))。
4.几个新的函数式接口:
1.Predicate test()方法 -->T->Boolean
2.Consume的accept()方法--->T->()
3.Supplier的get()方法--->()->T
4.Function的apply()方法----》将T转换成R
5.UnaryOperator<T>--->extends Function(表示操作符,可用于计算)
6.BiFunction/BiPredicate/BinaryOperate(Extends BiFunction)(Bi表示接受两个函数返回1个)
5.泛型(伪泛型)+(泛型数组)+(泛型擦除(Object/边界))+频繁的拆装箱(IntPredicate/LongPredicate(泛型特化))
6.任何函数式接口都不允许抛出受检异常(异常分为Error与Exception,Exception分为运行时异常(RuntimeException及其子类)与非运行时异常(编译异常,必须手动抛出捕获异常,否则或报错,如IOException与ClassNotFoundException)),所以需要lambda表达式来抛出异常的话 1.自己通过@FunctionalInterface来定义一个函数式接口,里面定义的方法throws IOException和自己用try/catch来显示定义异常。
7.类型检查/类型推断以及限制( Callable<Integer> c=()->42; PrivilegeAction<INteger> p=()->42;(Java的安全模型里面的,用于某些具有优先级的判断))。只要函数式接口要求的类型转换满足,同一个Lambda表达式就可以作用于不同的函数式接口。Java7引入的菱形运算符,利用泛型推断从上下文推断类型的思想。(注:特殊的void兼容:void可以兼容是语句表达式的 如:Predicate<String> p=s->list.add(s) 和Consume<String> b=s->s.add(s));类型推断是Lambda可以省略具体类型的基础;
8.Lambda表达式可以没有限制的捕获实例变量和静态变量,但局部变量有限制(必须显示或者隐式的是final的),也就是只能捕获指派给他们的局部变量一次。(因为实例变量保存在堆里面,堆中可以共享,但局部变量保存在栈里面,而且隐式表明他们仅限于当前线程)。
9.方法引用 Comparator::comparing ArrayList::new 对构造函数进行引用 1个变量 supplier=Constructor::new get 2个变量用function=ConStruction::new apply 3个变量的话可以自己构造可以接受3个变量的Function函数。
10.Lambda表达式的复合(多个Lambda表达式复合成复杂的表达式); 1.比较器复合 Comparing.thenComparing 2.谓词复合and or(从左到右确定优先级)3.函数复合 f.andThen(g)--g(f(x)) f.compose(g)--f(g(x))
这一部分是整本书的核心部分,里面每个章节都要细看(filter, skip, limit, reduce, map, findAny, forEach,collect)
1. 默认方法: 这算是Java8的一大亮点吧
2. 引入Optional替代null: 从Guava中引入但又只是个半成品,说有用也是有用的,说没有用也可以,使用Optional应该是一种理念吧。
3. 新的日期时间API: 从joda引入但依然是半成品,并没有感觉出相对于现在Date&Calendar&Joda有什么优势,比较鸡肋的补充
关于java8的基础知识有什么呢问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注亿速云行业资讯频道了解更多相关知识。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。