从 java 8到 java 11变化一览

变量

从Java 10开始,开发人员可以选择让编译器使用var来推断类型:

var x=1.0/2.0
var list = new ArrayList<String>();  
var stream = list.stream();


// Type inference can be (Java 8)
Function helloFunction = s -> "Hello " + s;
 
// Inference of generics (Diamond Operator, since Java 7)
List strings = new ArrayList<>();
strings.add(helloFunction.apply("World"));
 
// Inference of generics (Diamond Operator) with anonymous inner classes (Java 9 -> JEP 213)
Consumer printer = new Consumer<>() {
    @Override
    public void accept(String string) {
        System.out.println(string);
    }
};
strings.forEach(printer::accept);

Java11已经提高了lambda中的var能力:

IntFunction<Integer> doubleIt1 = (int x) -> x * 2; // OK Java 10 and 11
IntFunction<Integer> doubleIt2 = (var x) -> x * 2; // OK Java 11

更复杂案例:

/ /Inference of parameters in Lambda expressions
Consumer<String> printer = (var s) -> System.out.println(s); // statt s -> System.out.println(s);
 
// But no mixture of "var" and declarated types possible
// BiConsumer<String, String> printer = (var s1, String s2) -> System.out.println(s1 + " " + s2);
 
// Useful for type annotations
BiConsumer<String, String> printer = (@Nonnull var s1, @Nullable var s2) -> System.out.println(s1 + (s2 == null ? "" : " " + s2));

// given
Optional<String> value = Optional.of("properValue");
AtomicInteger successCounter = new AtomicInteger(0);
 
AtomicInteger onEmptyOptionalCounter = new AtomicInteger(0);
 
// when
value.ifPresentOrElse(
   v -> successCounter.incrementAndGet(), 
   onEmptyOptionalCounter::incrementAndGet);

String新方法

java 8加入新方法join:

Set<String> set1 = Set.of("a","b", "c");
List<String> list1 = List.of("a","b", "c");
  
System.out.println( String.join("a", "b", "c") );
System.out.println( String.join(".", set1) );
System.out.println( String.join(".", list1) );

Java9 有了一个返回Stream的新方法

Java11 添加了更多String的新方法:

String.repeat(int)
String.lines()
String.strip()
String.stripLeading()
String.stripTrailing()
String.isBlank()

接口

java8:

  1. 常量Constant variables
  2. 抽象方法Abstract methods
  3. 默认方法Default methods
  4. 静态方法Static methods

Java9:

  1. Constant variables
  2. Abstract methods
  3. Default methods
  4. Static methods
  5. 私有方法Private methods
  6. 私有静态方法Private Static methods

Java11:

看一个接口的完整代码:

//generic interface with one type parameter T
interface SomeInterface<T> { 
 int SOME_CONSTANT = 35; // variable declaration
 int abstractMethod(int x, int y);   // method declaration
 T abstractMethodUsingGenericType(T[] array, int i); // method using type parameter
 default int defaultMethod(int x, int y) {
     // implementation of method
  return 0;
 }
 static void main(String[] args) {
     // any static method, including main can be included in interface
 }
 
 
 private void privateMethod(String[] args) {
     // any private  method can be included in interface
 }
 
 private static void staticMethod(String[] args) {
     // any private static method can be included in interface
 }
 
  // nested class definition
 class NestedClass { 
     // members of a class
 }
 // nested interface definition
 interface NestedInterface { 
     // member of an interface
 }
// nested enum definition
 enum NestedEnum {   
     OBJECT1,
     OBJECT2,
     ;
     // methods, variables and constructors
 }
  // nested annotation definition
 @interface NestedAnnotation {   
     String attrib1();
 }
}

Nullable管理

java8引入了新的Optional。

// return an optional empty object
Optional<String> optional = Optional.empty();

// return an optional with value object
String str = "value";
Optional<String> optional = Optional.of(str);

// return an optional with or without value 
Optional<String> optional = Optional.ofNullable(getString());
// how to solve String version = computer?.getSoundcard()?.getUSB()?.getVersion() ?: "UNKNOWN";
// with map
String version = computer.flatMap(Computer::getSoundcard)
                            .flatMap(Soundcard::getUSB)
                            .map(USB::getVersion)
                            .orElse("UNKNOWN");
//list

List<String> list = getList();
List<String> listOpt = list != null ? list : new ArrayList<>();

// is equivalent to
List<String> listOpt = getList().orElseGet(() -> new ArrayList<>());

java9中可以返回另外一个Optional ,使用增强方法ifPresentOrElse :

String defaultString = "default";
Optional<String> value = Optional.empty();
Optional<String> defaultValue = Optional.of(defaultString);

// when
Optional<String> result = value.or(() -> defaultValue);


// given
Optional<String> value = Optional.of("properValue");
AtomicInteger successCounter = new AtomicInteger(0);
 
AtomicInteger onEmptyOptionalCounter = new AtomicInteger(0);
 
// when
value.ifPresentOrElse(
   v -> successCounter.incrementAndGet(), 
   onEmptyOptionalCounter::incrementAndGet);

也增加了stream方法。

Java10中有新的方法叫:orElseThrow

Java11中代码如下:

Optional.of(string).isEmpty()

Stream

Java8 引入了新的Stream:

// starting from list
List<String> myList =
    Arrays.asList("a1", "a2", "b1", "c2", "c1");

myList
    .stream()
    .filter(s -> s.startsWith("c"))
    .map(String::toUpperCase)
    .sorted()
    .forEach(System.out::println);

// native stream 
Stream.of("a1", "a2", "a3")
    .findFirst()
    .ifPresent(System.out::println);

可以和number和map一起运行:

// working with number
IntStream.range(1, 4)
    .forEach(System.out::println);

// working with map
Arrays.stream(new int[] {1, 2, 3})
    .map(n -> 2 * n + 1)
    .average()
    .ifPresent(System.out::println);

流提供者可以多次重用流Stream,从而避免了集合中臭名昭著的错误:

java.lang.IllegalStateException: stream has already been operated upon or closed

Supplier<Stream<String>> streamSupplier =
    () -> Stream.of("d2", "a2", "b1", "b3", "c")
            .filter(s -> s.startsWith("a"));

streamSupplier.get().anyMatch(s -> true);   // ok
streamSupplier.get().noneMatch(s -> true);  // ok

收集器可以转换到几种List:

List<Person> filtered =
    persons
        .stream()
        .filter(p -> p.name.startsWith("P"))
        .collect(Collectors.toList());

使用flatmap管理nullability

Outer outer = new Outer();
if (outer != null && outer.nested != null && outer.nested.inner != null) {
    System.out.println(outer.nested.inner.foo);
}

// similar to类似上面代码的新写法
Optional.of(new Outer())
    .flatMap(o -> Optional.ofNullable(o.nested))
    .flatMap(n -> Optional.ofNullable(n.inner))
    .flatMap(i -> Optional.ofNullable(i.foo))
    .ifPresent(System.out::println);

Java9中引入了iterate 和 takeWhile/dropWhile方法:

Stream.iterate(0, i -> i < 10, i -> i + 1) .forEach(System.out::println);
System.out.println("stream take while");


Stream<String> stream1 = Stream.iterate("", s -> s + "s")
      .takeWhile(s -> s.length() < 10);
  
stream1.forEach(System.out::println);

Java11引入了Not谓词,以前代码:

lines.stream()          
         .filter(s -> !s.isBlank())

现在可以是:

lines.stream()          
         .filter(Predicate.not(String::isBlank))

响应式Stream

Java9 引入了java.util.concurrent.Flow的四个接口:

  • Flow.Processor
  • Flow.Publisher
  • Flow.Subscriber
  • Flow.Subscription

还有不可变集合:

// empty immutable collections
 List<String> emptyImmutableList = List.of();
 Set<String> emptyImmutableSet = Set.of();
 Map emptyImmutableMap = Map.of();

// immutable collections
List<String> immutableList = List.of("one", "two");
Set<String> immutableSet = Set.of("value1", "value2");
Map<String, String> immutableMap = Map.of("key1", "Value1", "key2", "Value2", "key3", "Value3");

Java9引入了MultiResolutionImage和提高了Process API

Java10提高了通过List.copyOf(), Set.copyOf(), Map.copyOf()创建不可变集合能力,Collectors类有了新方法toUnmodifiableList, toUnmodifiableSet, toUnmodifiableMap.

新语法

Java 9 try-with-resource现在支持内部可自定义:

try (new MyAutoCloseable() { }.finalWrapper.finalCloseable) {
     // do some stuff with finalCloseable
  } catch (Exception ex) { }

Java 9还支持带有菱形运算符的匿名类:

List<String> list = new ArrayList<>(){ };

Java 9支持支持HTTP / 2和websockets的新HTTP客户端API。

Java 11改善了HTTP客户端API支撑

int numLetters = switch (day) {
    case MONDAY, FRIDAY, SUNDAY -> 6;
    case TUESDAY                -> 7;
    case THURSDAY, SATURDAY     -> 8;
    case WEDNESDAY              -> 9;
};

Lambdas

Java8中已经引入了Lambda语法:s -> do(s)

为了支持Lambda,引入了5个接口:Consumer, Function, Supplier, Predicate, Operator

在Iterable & Stream & Optional上增加了几个方法:

  • forEach
  • filter
  • map
  • flatMap
  • collect
  • ...

Java 11提高了Lambda的var推断能力

Deprecated

Java 9 short list

  1. java.activation
  2. java.corba
  3. java.se.ee
  4. java.transaction
  5. java.xml.bind
  6. java.xml.ws
  7. java.xml.ws.annotation
  8. jdk.policytool

Java 11 short list

Java EE packages removed

  • javax.activation (java.activation)
  • javax.activity, javax.rmi, javax.rmi.CORBA, org.omg.* (java.corba)
  • javax.transaction (java.transaction)
  • javax.xml.bind.* (java.xml.bind)
  • javax.jws, javax.jws.soap, javax.xml.soap, javax.xml.ws.*(java.xml.ws)
  • javax.annotation (java.xml.ws.annotation)

欢迎大家加入粉丝群:963944895,群内免费分享Spring框架、Mybatis框架SpringBoot框架、SpringMVC框架、SpringCloud微服务、Dubbo框架、Redis缓存、RabbitMq消息、JVM调优、Tomcat容器、MySQL数据库教学视频及架构学习思维导图

日志

Java9提供了日志级别和作用域:

java -Xlog:all=debug:file=application.log -version

写在最后:

既然看到这里了,觉得笔者写的还不错的就点个赞,加个关注呗!点关注,不迷路,持续更新!!!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,546评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,224评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,911评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,737评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,753评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,598评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,338评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,249评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,696评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,888评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,013评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,731评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,348评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,929评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,048评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,203评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,960评论 2 355

推荐阅读更多精彩内容