JDK1.8快速入門


JDK8提供了非常多的便捷用法和語法糖,其編碼效率幾乎接近於C#開發,maven則是java目前為止最贊的jar包管理和build工具,這兩部分內容都不算多,就合並到一起了。

願編寫java代碼的過程如:Fast & Furious

鳥槍換炮咯,走起!J Java 7發布於2011年,Java 8發布於2014年,Java 9還遠么?

在javase8中,lambda表達式的形式基本好C#中一致,Stream和LINQ類似,Future<T>和Task<T>類似,可以這樣說,javase8大體達到了C#編碼的便捷程度哈!帥帥噠

  • Lambda(和.NET一樣)

功能

示例

函數式接口

Arrays.sort(words, (first, second) ->

Integer.compare(first.length(), second.length()));

BiFunction<String, String, Integer> comp =

(first, second) -> Integer.compare(first.length(), second.length());

常見的函數式接口(推薦使用),和C#Action<T>,Function<T, R>類似

Runnable,Supplier<T>,Consumer<T>, Function<T, R>, Predicate<T>

方法引用

Arrays.sort(words, String::compareToIgnoreCase);

構造器引用

list.stream().collect(Collectors.toList());

默認方法,接口中的靜態方法

不太推薦

概念

所有的lambda表達式都符合閉包,且是延遲執行的

  • Stream

功能

示例

創建Stream

Stream<String> song = Stream.of("Shanghai", "Beijing");

filter,map,flatmap方法

分別對應C#中Linq的where,select和selectMany

 

Optional<TravelTicket> tempTT = availableTicketMapper.values().stream().flatMap(i -> i.stream())
.filter(i -> i.getID() == item.getTravelMoneyID()).findFirst()

 

常見操作

去除重復: .distince()

排序.sorted(), 反向.reversed()

 

List<TravelTicketCommonDTO> targetList = orderedAvailableTTInfoList.stream()
.filter(i -> i.getTicketCategoryID().equals(item.getTicketCategoryID())
&& i.getCanRefundAmount().compareTo(BigDecimal.ZERO) > 0)
.sorted(Comparator.comparing(TravelTicketCommonDTO::getExpirationDate).reversed())
.collect(Collectors.toList());

聚合方法 .max(), findFirst(), .findAny(), .anyMatch()

聚合操作 .reduce((x,y)->x+y),reduce(BigDecimal.ZERO, BigDecimal::add)

分組和分片: .groupingBy(), mapping(), joining()

並行流: .parallel()

Optional類型

Optional<T>是對T類型封裝,它不會返回null,使得引用更安全

  • 時間日期

在1.8以前,主要使用joda-time庫來處理一些比較復雜的時間日期操作,現在有官方的api了。

http://www.cnblogs.com/565261641-fzh/p/5683594.html

功能

示例

時間線Instant

Instant start = Instant.now();

Thread.sleep(1000);

Instant end = Instant.now();

Duration timeElapsed = Duration.between(start, end);

long millis = timeElapsed.toMillis();

本地日期LocalDate

LocalDate today = LocalDate.now();

LocalDate oneDay = LocalDate.of(2017, 7, 9);

LocalDate addDay = LocalDate.now().plusDays(10);

日期校正器TemporalAdjueters

獲取2017年5月的第一個周二

LocalDate time = LocalDate.of(2017, 5, 1)

.with(TemporalAdjusters.nextOrSame(DayOfWeek.TUESDAY));

本地時間LocalTime

LocalTime time = LocalTime.of(16, 37, 11);

帶時區的時間ZonedDateTime

ZonedDateTime applloTime = ZonedDateTime.of(2017, 5, 9, 16, 40, 11, 0, ZoneId.of("America/New_York"));

格式化和解析DateTimeFormatter

用於替代過去的DateFormat,SimpleDateFormat

遺留代碼的互操作

Instant start = Instant.now();其他類型的操作類似

Date oldDate = Date.from(start);

  • 並發

功能

示例

原子值

AtomicLong nextNumber = new AtomicLong();

nextNumber.incrementAndGet();

ConcurrentHashMap的改進

ConcurrentMap<String, Integer> map = new ConcurrentHashMap();

map.putIfAbsent("age", 100);

map.compute("name", (k, v) -> v == null ? 1 : v + 1);

map.merge("age", 1, (oldValue, newValue) -> oldValue + newValue);

批量數據操作:reduceValue, reduceKeys

並行數組操作

String[] people = new String[]{"xionger", "shuaishuaida"};

Arrays.parallelSort(people);

Future,和.NET的Task<T>類似

CompletableFuture<String> contents =

CompletableFuture.supplyAsync(() -> getAsync());

這部分知識之后再加強

  • 雜項

功能

示例

字符串

String joined = String.join("/", "user", "local", "bin");

數字擴展

Long testValue = Integer.toUnsignedLong(Integer.MAX_VALUE);

新的數值函數

int result = Math.floorMod(Math.toIntExact(100L), 3);

新增集合方法

list.forEach((item) -> System.out.println(item));

Map: remove, putIfAbsent, computeIf, merge

排序:Arrays.sort(people, Comparator.comparing(Person::getAge));

使用文件

這兒看到try-with-resource,等價於using,java代碼也可以和.net一樣簡介

try (Stream<String> lines = Files.lines(path)) {

    Optional<String> pwd = lines.filter(s -> s.contains("pwd")).findFirst();}

Base64編碼

Base64.Encoder encoder = Base64.getMimeEncoder();

try (OutputStream output = Files.newOutputStream(encoderPath)) {

    Files.copy(originalPath, encoder.wrap(output));}

注解

通過在注解上添加@Repeatable,使得注解可多次使用

可以使用基於類型的注解

private @NonNull List<String> names = new ArrayList<>();

方法參數反射,可以反射獲取參數的名稱

Java7

使用Path接口來代替File類

Path absolute = Paths.get("/", "home", "shanghai ");

Files.write(absolute, content.getBytes(StandardCharsets.UTF_8));

Tip: demo項目

Java Decimal運算需要注意:

1、 ROUND_UP:向上取整(丟掉小數,整數加1) 遠離零方向舍入。向絕對值最大的方向舍入,只要舍棄位非0即進位。
2、ROUND_DOWN:向下取整(丟掉小數)。趨向零方向舍入。向絕對值最小的方向輸入,所有的位都要舍棄,不存在進位情況。
3、ROUND_CEILING:向正無窮方向走,始終不會減少計算值。如果 BigDecimal 為正,則舍入行為與 ROUND_UP 相同;如果為負,則舍入行為與 ROUND_DOWN 相同。Math.round()方法就是使用的此模式。
4、ROUND_FLOOR:向負無窮方向舍入。向負無窮方向靠攏。若是正數,舍入行為類似於ROUND_DOWN;若為負數,舍入行為類似於ROUND_UP。
5、 HALF_UP:四舍五入,最近數字舍入(5進)。
6、 HALF_DOWN:四舍六入,最近數字舍入(5舍)。
7、 HAIL_EVEN:銀行家舍入法。四舍六入五偶舍。即舍棄位4舍6入,當為5時看前一位,奇進偶舍。向“最接近的”數字舍入,如果與兩個相鄰數字的距離相等,則向相鄰的偶數舍入。
     也就是說,如果舍棄部分左邊的數字為奇數,則舍入行為與 ROUND_HALF_UP 相同; 如果為偶數,則舍入行為與 ROUND_HALF_DOWN 相同。
     注意,在重復進行一系列計算時,此舍入模式可以將累加錯誤減到最小。
8、ROUND_UNNECESSARY 斷言請求的操作具有精確的結果,因此不需要舍入。如果對獲得精確結果的操作指定此舍入模式,則拋出ArithmeticException。

String[] tempList = ticketCategoryIDListString.split("\\.");//大坑

參考資料

  1. Cay, S, Horstmann. 寫給大忙人看的JavaSE8[M]. 北京:電子工業出版社, 2015.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM