欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
java8的新特性以及用法簡(jiǎn)介,再不學(xué)習,代碼都看不懂了

1. 介紹

本文簡(jiǎn)單介紹下java8里面有哪些新的特性,以及相關(guān)的用法。

JAVA8是意義深遠的一個(gè)新版本。隨著(zhù)大數據的興起,函數式編程在處理大數據上的優(yōu)勢開(kāi)始體現。JAVA8也緊跟時(shí)代,引入了函數式語(yǔ)言的特性,值得關(guān)注。下面看看其有哪些新的內容。

2 接口的默認方法

Java 8允許我們給接口添加一個(gè)非抽象的方法實(shí)現,只需要使用 default關(guān)鍵字即可,這個(gè)特征又叫做擴展方法。JAVA可以實(shí)現多個(gè)接口,從而來(lái)對原本的類(lèi)進(jìn)行方法擴展。JAVA只能繼承1個(gè)類(lèi),所以以前的接口沒(méi)法提供這種靈活的擴展方法?,F在要簡(jiǎn)單的擴展方法,也不需要使用Spring的代碼織入了,直接用擴展方法即可。不過(guò)橫切邏輯織入還是用Spring好。

下面看個(gè)例子:

interface Formula { double calculate(int a); //default修飾的擴展方法 default double sqrt(int a) { return Math.sqrt(a); } }

Formula接口在擁有calculate方法之外同時(shí)還定義了sqrt方法,實(shí)現了Formula接口的子類(lèi)只需要實(shí)現一個(gè)calculate方法,默認方法sqrt將在子類(lèi)上可以直接使用。

Formula formula = new Formula() { @Override public double calculate(int a) { return sqrt(a * 100); } }; formula.calculate(100); // 100.0 formula.sqrt(16); // 4.0

新的Java 8 的這個(gè)特新在編譯器實(shí)現的角度上來(lái)說(shuō)更加接近Scala的trait。 在C#中也有名為擴展方法的概念,允許給已存在的類(lèi)型擴展方法,和Java 8的這個(gè)在語(yǔ)義上有差別。

2 lambda表達式

首先看看在老版本的Java中是如何排列字符串的:

List names = Arrays.asList('peter', 'anna', 'mike', 'xenia'); Collections.sort(names, new Comparator() { @Override public int compare(String a, String b) { return b.compareTo(a); } });

只需要給靜態(tài)方法 Collections.sort 傳入一個(gè)List對象以及一個(gè)比較器來(lái)按指定順序排列。通常做法都是創(chuàng )建一個(gè)匿名的比較器對象然后將其傳遞給sort方法。在Java 8 中你就沒(méi)必要使用這種傳統的匿名對象的方式了,Java 8提供了更簡(jiǎn)潔的語(yǔ)法,lambda表達式:

Collections.sort(names, (String a, String b) -> { return b.compareTo(a); });

看到了吧,代碼變得更段且更具有可讀性,但是實(shí)際上還可以寫(xiě)得更短:

Collections.sort(names, (String a, String b) -> b.compareTo(a));

對于函數體只有一行代碼的,你可以去掉大括號{}以及return關(guān)鍵字,但是你還可以寫(xiě)得更短點(diǎn),Java編譯器可以自動(dòng)推導出參數類(lèi)型,所以你可以不用再寫(xiě)一次類(lèi)型。

Collections.sort(names, (a, b) -> b.compareTo(a));

2.1 函數式接口

每個(gè)lambda表達式對應一個(gè)函數式接口。函數式接口”是指僅僅只包含一個(gè)抽象方法的接口,每一個(gè)該類(lèi)型的lambda表達式都會(huì )被匹配到這個(gè)抽象方法。因為 默認方法 不算抽象方法,所以你也可以給你的函數式接口添加默認方法。

我們可以將lambda表達式當作任意只包含一個(gè)抽象方法的接口類(lèi)型,確保你的接口一定達到這個(gè)要求,你只需要給你的接口添加 @FunctionalInterface 注解,編譯器如果發(fā)現你標注了這個(gè)注解的接口有多于一個(gè)抽象方法的時(shí)候會(huì )報錯的。

//需要注解修飾表明是函數式接口@FunctionalInterface interface Converter { //必須僅包含一個(gè)抽象方法,用于lambda表達式給出具體實(shí)現。這里可以包含擴展方法 T convert(F from); } // Integer.valueOf(from)是函數式接口里面抽象方法的實(shí)現。Converter converter = (from) -> Integer.valueOf(from); Integer converted = converter.convert('123'); System.out.println(converted); // 123

需要注意如果@FunctionalInterface如果沒(méi)有指定,上面的代碼也是對的。

譯者注 將lambda表達式映射到一個(gè)單方法的接口上,這種做法在Java 8之前就有別的語(yǔ)言實(shí)現,比如Rhino JavaScript解釋器,如果一個(gè)函數參數接收一個(gè)單方法的接口而你傳遞的是一個(gè)function,Rhino 解釋器會(huì )自動(dòng)做一個(gè)單接口的實(shí)例到function的適配器

2.2 方法與構造函數引用

Java 8 允許你使用 :: 關(guān)鍵字來(lái)傳遞方法或者構造函數引用

Converter converter = Integer::valueOf; Integer converted = converter.convert('123'); System.out.println(converted); // 123

獲取構造函數的引用的話(huà)使用 ::new,后面接new關(guān)鍵字即可。

2.3 訪(fǎng)問(wèn)局部變量

在lambda表達式中訪(fǎng)問(wèn)外層作用域和老版本的匿名對象中的方式很相似。你可以直接訪(fǎng)問(wèn)標記了final的外層局部變量,或者實(shí)例的字段以及靜態(tài)變量。

//不用final修飾也可以訪(fǎng)問(wèn),但是要確保其不備修改,所以還是建議用final修飾final int num = 1; Converter stringConverter =(from) -> String.valueOf(from + num); stringConverter.convert(2); // 3

2.4 訪(fǎng)問(wèn)對象字段與靜態(tài)變量

和本地變量不同的是,lambda內部對于實(shí)例的字段以及靜態(tài)變量是即可讀又可寫(xiě)。該行為和匿名對象是一致的:

class Lambda4 { static int outerStaticNum; int outerNum; void testScopes() { Converter stringConverter1 = (from) -> { outerNum = 23; return String.valueOf(from); }; Converter stringConverter2 = (from) -> { outerStaticNum = 72; return String.valueOf(from); }; } }

3. 內建函數式接口

JDK 1.8 API包含了很多內建的函數式接口,在老Java中常用到的比如Comparator或者Runnable接口,這些接口都增加了@FunctionalInterface注解以便能用在lambda上。

Java 8 API同樣還提供了很多全新的函數式接口來(lái)讓工作更加方便,有一些接口是來(lái)自Google Guava庫里的,即便你對這些很熟悉了,還是有必要看看這些是如何擴展到lambda上使用的。

這些已經(jīng)默認提供的內建函數式接口主要是:

3.1 Predicate接口

Predicate 接口只有一個(gè)參數,返回boolean類(lèi)型。該接口包含多種默認方法來(lái)將Predicate組合成其他復雜的邏輯(比如:與,或,非):

//用于做一些判斷Predicate predicate = (s) -> s.length() > 0; predicate.test('foo'); // true predicate.negate().test('foo'); // false Predicate nonNull = Objects::nonNull; Predicate isNull = Objects::isNull; Predicate isEmpty = String::isEmpty; Predicate isNotEmpty = isEmpty.negate();

3.2 Function 接口

Function 接口有一個(gè)參數并且返回一個(gè)結果,并附帶了一些可以和其他函數組合的默認方法(compose, andThen):

Function toInteger = Integer::valueOf; Function backToString = toInteger.andThen(String::valueOf); backToString.apply('123'); // '123'

3.3 Supplier 接口

Supplier 接口返回一個(gè)任意范型的值,和Function接口不同的是該接口沒(méi)有任何參數

Supplier personSupplier = Person::new; personSupplier.get(); // new Person

3.4 Consumer 接口

Consumer 接口表示執行在單個(gè)參數上的操作。

Consumer greeter = (p) -> System.out.println('Hello, ' + p.firstName); greeter.accept(new Person('Luke', 'Skywalker'));

3.5 Comparator 接口

Comparator 是老Java中的經(jīng)典接口, Java 8在此之上添加了多種默認方法:

Comparator comparator = (p1, p2) -> p1.firstName.compareTo(p2.firstName); Person p1 = new Person('John', 'Doe'); Person p2 = new Person('Alice', 'Wonderland'); comparator.compare(p1, p2); // > 0 comparator.reversed().compare(p1, p2); // < 0="">

3.6 Optional 接口

Optional 不是函數是接口,這是個(gè)用來(lái)防止NullPointerException異常的輔助類(lèi)型,這是下一屆中將要用到的重要概念,現在先簡(jiǎn)單的看看這個(gè)接口能干什么:

Optional 被定義為一個(gè)簡(jiǎn)單的容器,其值可能是null或者不是null。在Java 8之前一般某個(gè)函數應該返回非空對象但是偶爾卻可能返回了null,而在Java 8中,不推薦你返回null而是返回Optional。

Optional optional = Optional.of('bam'); optional.isPresent(); // true optional.get(); // 'bam' optional.orElse('fallback'); // 'bam' optional.ifPresent((s) -> System.out.println(s.charAt(0))); // 'b'

3.7 Stream 接口

java.util.Stream 表示能應用在一組元素上一次執行的操作序列。Stream 操作分為中間操作或者最終操作兩種,最終操作返回一特定類(lèi)型的計算結果,而中間操作返回Stream本身,這樣你就可以將多個(gè)操作依次串起來(lái)。Stream 的創(chuàng )建需要指定一個(gè)數據源,比如 java.util.Collection的子類(lèi),List或者Set, Map不支持。Stream的操作可以串行執行或者并行執行。

首先看看Stream是怎么用,首先創(chuàng )建實(shí)例代碼的用到的數據List:

List stringCollection = new ArrayList<>(); stringCollection.add('ddd2'); stringCollection.add('aaa2'); stringCollection.add('bbb1'); stringCollection.add('aaa1'); stringCollection.add('bbb3'); stringCollection.add('ccc'); stringCollection.add('bbb2'); stringCollection.add('ddd1');

Java 8擴展了集合類(lèi),可以通過(guò) Collection.stream() 或者 Collection.parallelStream() 來(lái)創(chuàng )建一個(gè)Stream。下面幾節將詳細解釋常用的Stream操作:

3.7.1 Filter過(guò)濾

過(guò)濾通過(guò)一個(gè)predicate接口來(lái)過(guò)濾并只保留符合條件的元素,該操作屬于中間操作,所以我們可以在過(guò)濾后的結果來(lái)應用其他Stream操作(比如forEach)。forEach需要一個(gè)函數來(lái)對過(guò)濾后的元素依次執行。forEach是一個(gè)最終操作,所以我們不能在forEach之后來(lái)執行其他Stream操作。

stringCollection .stream() .filter((s) -> s.startsWith('a')) .forEach(System.out::println); // 'aaa2', 'aaa1'

3.7.2 Sort 排序

排序是一個(gè)中間操作,返回的是排序好后的Stream。如果你不指定一個(gè)自定義的Comparator則會(huì )使用默認排序。

stringCollection .stream() .sorted() .filter((s) -> s.startsWith('a')) .forEach(System.out::println); // 'aaa1', 'aaa2'

需要注意的是,排序只創(chuàng )建了一個(gè)排列好后的Stream,而不會(huì )影響原有的數據源,排序之后原數據stringCollection是不會(huì )被修改的:

System.out.println(stringCollection); // ddd2, aaa2, bbb1, aaa1, bbb3, ccc, bbb2, ddd1

3.7.3 Map 映射

中間操作map會(huì )將元素根據指定的Function接口來(lái)依次將元素轉成另外的對象,下面的示例展示了將字符串轉換為大寫(xiě)字符串。你也可以通過(guò)map來(lái)講對象轉換成其他類(lèi)型,map返回的Stream類(lèi)型是根據你map傳遞進(jìn)去的函數的返回值決定的。

stringCollection .stream() .map(String::toUpperCase) .sorted((a, b) -> b.compareTo(a)) .forEach(System.out::println); // 'DDD2', 'DDD1', 'CCC', 'BBB3', 'BBB2', 'AAA2', 'AAA1'

3.7.4 Match 匹配

Stream提供了多種匹配操作,允許檢測指定的Predicate是否匹配整個(gè)Stream。所有的匹配操作都是最終操作,并返回一個(gè)boolean類(lèi)型的值。

boolean anyStartsWithA = stringCollection .stream() .anyMatch((s) -> s.startsWith('a')); System.out.println(anyStartsWithA); // true boolean allStartsWithA = stringCollection .stream() .allMatch((s) -> s.startsWith('a')); System.out.println(allStartsWithA); // false boolean noneStartsWithZ = stringCollection .stream() .noneMatch((s) -> s.startsWith('z')); System.out.println(noneStartsWithZ); // true

3.7.5 Count 計數

計數是一個(gè)最終操作,返回Stream中元素的個(gè)數,返回值類(lèi)型是long。

long startsWithB = stringCollection .stream() .filter((s) -> s.startsWith('b')) .count(); System.out.println(startsWithB); // 3

3.7.6 Reduce 規約

這是一個(gè)最終操作,允許通過(guò)指定的函數來(lái)講stream中的多個(gè)元素規約為一個(gè)元素,規越后的結果是通過(guò)Optional接口表示的:

Optional reduced = stringCollection .stream() .sorted() .reduce((s1, s2) -> s1 + '#' + s2); reduced.ifPresent(System.out::println); // 'aaa1#aaa2#bbb1#bbb2#bbb3#ccc#ddd1#ddd2'

3.7.7 并行Streams

前面提到過(guò)Stream有串行和并行兩種,串行Stream上的操作是在一個(gè)線(xiàn)程中依次完成,而并行Stream則是在多個(gè)線(xiàn)程上同時(shí)執行。

下面的例子展示了是如何通過(guò)并行Stream來(lái)提升性能:

首先我們創(chuàng )建一個(gè)沒(méi)有重復元素的大表:

int max = 1000000; List values = new ArrayList<>(max); for (int i = 0; i < max;="" i++)="" {="" uuid="" uuid="UUID.randomUUID();" values.add(uuid.tostring());="" }="">

然后我們計算一下排序這個(gè)Stream要耗時(shí)多久,

串行排序:

long t0 = System.nanoTime(); long count = values.stream().sorted().count(); System.out.println(count); long t1 = System.nanoTime(); long millis = TimeUnit.NANOSECONDS.toMillis(t1 - t0); System.out.println(String.format('sequential sort took: %d ms', millis));

// 串行耗時(shí): 899 ms

并行排序:

long t0 = System.nanoTime(); long count = values.parallelStream().sorted().count(); System.out.println(count); long t1 = System.nanoTime(); long millis = TimeUnit.NANOSECONDS.toMillis(t1 - t0); System.out.println(String.format('parallel sort took: %d ms', millis));

// 并行排序耗時(shí): 472 ms

上面兩個(gè)代碼幾乎是一樣的,但是并行版的快了50%之多,唯一需要做的改動(dòng)就是將stream()改為parallelStream()。

4. Map

前面提到過(guò),Map類(lèi)型不支持stream,不過(guò)Map提供了一些新的有用的方法來(lái)處理一些日常任務(wù)。

Map map = new HashMap<>(); for (int i = 0; i < 10;="" i++)="" {="" map.putifabsent(i,="" 'val'="" +="" i);="" }map.foreach((id,="" val)="" -=""> System.out.println(val));

以上代碼很容易理解, putIfAbsent 不需要我們做額外的存在性檢查,而forEach則接收一個(gè)Consumer接口來(lái)對map里的每一個(gè)鍵值對進(jìn)行操作。

下面的例子展示了map上的其他有用的函數:

map.computeIfPresent(3, (num, val) -> val + num); map.get(3); // val33 map.computeIfPresent(9, (num, val) -> null); map.containsKey(9); // false map.computeIfAbsent(23, num -> 'val' + num); map.containsKey(23); // true map.computeIfAbsent(3, num -> 'bam'); map.get(3); // val33

接下來(lái)展示如何在Map里刪除一個(gè)鍵值全都匹配的項:

map.remove(3, 'val3'); map.get(3); // val33 map.remove(3, 'val33'); map.get(3); // null

另外一個(gè)有用的方法:

map.getOrDefault(42, 'not found'); // not found

對Map的元素做合并也變得很容易了:

map.merge(9, 'val9', (value, newValue) -> value.concat(newValue)); map.get(9); // val9 map.merge(9, 'concat', (value, newValue) -> value.concat(newValue)); map.get(9); // val9concat

Merge做的事情是如果鍵名不存在則插入,否則則對原鍵對應的值做合并操作并重新插入到map中。

5. Date API

Java 8 在包java.time下包含了一組全新的時(shí)間日期A(yíng)PI。新的日期A(yíng)PI和開(kāi)源的Joda-Time庫差不多,但又不完全一樣,下面的例子展示了這組新API里最重要的一些部分:

5.1 Clock 時(shí)鐘

Clock類(lèi)提供了訪(fǎng)問(wèn)當前日期和時(shí)間的方法,Clock是時(shí)區敏感的,可以用來(lái)取代 System.currentTimeMillis() 來(lái)獲取當前的微秒數。某一個(gè)特定的時(shí)間點(diǎn)也可以使用Instant類(lèi)來(lái)表示,Instant類(lèi)也可以用來(lái)創(chuàng )建老的java.util.Date對象。

Clock clock = Clock.systemDefaultZone(); long millis = clock.millis(); Instant instant = clock.instant(); Date legacyDate = Date.from(instant); // legacy java.util.Date

5.2 Timezones 時(shí)區

在新API中時(shí)區使用ZoneId來(lái)表示。時(shí)區可以很方便的使用靜態(tài)方法of來(lái)獲取到。 時(shí)區定義了到UTS時(shí)間的時(shí)間差,在Instant時(shí)間點(diǎn)對象到本地日期對象之間轉換的時(shí)候是極其重要的。

System.out.println(ZoneId.getAvailableZoneIds()); // prints all available timezone ids ZoneId zone1 = ZoneId.of('Europe/Berlin'); ZoneId zone2 = ZoneId.of('Brazil/East'); System.out.println(zone1.getRules()); System.out.println(zone2.getRules()); // ZoneRules[currentStandardOffset=+01:00] // ZoneRules[currentStandardOffset=-03:00]

5.3 LocalTime 本地時(shí)間

LocalTime 定義了一個(gè)沒(méi)有時(shí)區信息的時(shí)間,例如 晚上10點(diǎn),或者 17:30:15。下面的例子使用前面代碼創(chuàng )建的時(shí)區創(chuàng )建了兩個(gè)本地時(shí)間。之后比較時(shí)間并以小時(shí)和分鐘為單位計算兩個(gè)時(shí)間的時(shí)間差:

LocalTime now1 = LocalTime.now(zone1); LocalTime now2 = LocalTime.now(zone2); System.out.println(now1.isBefore(now2)); // false long hoursBetween = ChronoUnit.HOURS.between(now1, now2); long minutesBetween = ChronoUnit.MINUTES.between(now1, now2); System.out.println(hoursBetween); // -3 System.out.println(minutesBetween); // -239

LocalTime 提供了多種工廠(chǎng)方法來(lái)簡(jiǎn)化對象的創(chuàng )建,包括解析時(shí)間字符串。

LocalTime late = LocalTime.of(23, 59, 59); System.out.println(late); // 23:59:59 DateTimeFormatter germanFormatter = DateTimeFormatter .ofLocalizedTime(FormatStyle.SHORT) .withLocale(Locale.GERMAN); LocalTime leetTime = LocalTime.parse('13:37', germanFormatter); System.out.println(leetTime); // 13:37

5.4 LocalDate 本地日期

LocalDate 表示了一個(gè)確切的日期,比如 2014-03-11。該對象值是不可變的,用起來(lái)和LocalTime基本一致。下面的例子展示了如何給Date對象加減天/月/年。另外要注意的是這些對象是不可變的,操作返回的總是一個(gè)新實(shí)例。

LocalDate today = LocalDate.now(); LocalDate tomorrow = today.plus(1, ChronoUnit.DAYS); LocalDate yesterday = tomorrow.minusDays(2); LocalDate independenceDay = LocalDate.of(2014, Month.JULY, 4); DayOfWeek dayOfWeek = independenceDay.getDayOfWeek();

System.out.println(dayOfWeek); // FRIDAY

從字符串解析一個(gè)LocalDate類(lèi)型和解析LocalTime一樣簡(jiǎn)單:

DateTimeFormatter germanFormatter = DateTimeFormatter .ofLocalizedDate(FormatStyle.MEDIUM) .withLocale(Locale.GERMAN); LocalDate xmas = LocalDate.parse('24.12.2014', germanFormatter); System.out.println(xmas); // 2014-12-24

5.5 LocalDateTime 本地日期時(shí)間

LocalDateTime 同時(shí)表示了時(shí)間和日期,相當于前兩節內容合并到一個(gè)對象上了。LocalDateTime和LocalTime還有LocalDate一樣,都是不可變的。LocalDateTime提供了一些能訪(fǎng)問(wèn)具體字段的方法。

LocalDateTime sylvester = LocalDateTime.of(2014, Month.DECEMBER, 31, 23, 59, 59); DayOfWeek dayOfWeek = sylvester.getDayOfWeek(); System.out.println(dayOfWeek); // WEDNESDAY Month month = sylvester.getMonth(); System.out.println(month); // DECEMBER long minuteOfDay = sylvester.getLong(ChronoField.MINUTE_OF_DAY); System.out.println(minuteOfDay); // 1439

只要附加上時(shí)區信息,就可以將其轉換為一個(gè)時(shí)間點(diǎn)Instant對象,Instant時(shí)間點(diǎn)對象可以很容易的轉換為老式的java.util.Date。

Instant instant = sylvester .atZone(ZoneId.systemDefault()) .toInstant(); Date legacyDate = Date.from(instant); System.out.println(legacyDate); // Wed Dec 31 23:59:59 CET 2014

格式化LocalDateTime和格式化時(shí)間和日期一樣的,除了使用預定義好的格式外,我們也可以自己定義格式:

DateTimeFormatter formatter = DateTimeFormatter .ofPattern('MMM dd, yyyy - HH:mm'); LocalDateTime parsed = LocalDateTime.parse('Nov 03, 2014 - 07:13', formatter); String string = formatter.format(parsed); System.out.println(string); // Nov 03, 2014 - 07:13

和java.text.NumberFormat不一樣的是新版的DateTimeFormatter是不可變的,所以它是線(xiàn)程安全的。

6. Annotation 注解

6.1 多重注解

在Java 8中支持多重注解了,先看個(gè)例子來(lái)理解一下是什么意思。

首先定義一個(gè)包裝類(lèi)Hints注解用來(lái)放置一組具體的Hint注解:

@interface Hints { Hint[] value(); } @Repeatable(Hints.class) @interface Hint { String value(); }

Java 8允許我們把同一個(gè)類(lèi)型的注解使用多次,只需要給該注解標注一下@Repeatable即可。

例子:

  1. 使用包裝類(lèi)當容器來(lái)存多個(gè)注解(老方法) java @Hints({@Hint('hint1'), @Hint('hint2')}) class Person {}

  1. 使用多重注解(新方法) java @Hint('hint1') @Hint('hint2') class Person {} 第二個(gè)例子里java編譯器會(huì )隱性的幫你定義好@Hints注解,了解這一點(diǎn)有助于你用反射來(lái)獲取這些信息: java Hint hint = Person.class.getAnnotation(Hint.class); System.out.println(hint); // null Hints hints1 = Person.class.getAnnotation(Hints.class); System.out.println(hints1.value().length); // 2 Hint[] hints2 = Person.class.getAnnotationsByType(Hint.class); System.out.println(hints2.length); // 2 即便我們沒(méi)有在Person類(lèi)上定義@Hints注解,我們還是可以通過(guò) getAnnotation(Hints.class) 來(lái)獲取 @Hints注解,更加方便的方法是使用 getAnnotationsByType 可以直接獲取到所有的@Hint注解。

6.2 新的target

另外Java 8的注解還增加到兩種新的target上了:

@Target({ElementType.TYPE_PARAMETER, ElementType.TYPE_USE}) @interface MyAnnotation {}

7. more

關(guān)于Java 8的新特性就寫(xiě)到這了,肯定還有更多的特性等待發(fā)掘。JDK 1.8里還有很多很有用的東西,比如Arrays.parallelSort, StampedLock和CompletableFuture等等。

有討論,才有進(jìn)步,大家各抒己見(jiàn),讓每位同學(xué)學(xué)到不一樣的!

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
JDK各個(gè)版本的新特性jdk1.5-jdk1.8
有點(diǎn)干貨 | Jdk1.8新特性實(shí)戰篇(41個(gè)案例)
Java 8簡(jiǎn)明教程
JAVA8 十大新特性詳解
Java 8新特性終極指南
【讀書(shū)筆記】《寫(xiě)給大忙人看的Java SE 8》
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久