1. 程式人生 > >Java8函數OA現金盤平臺出租式編程實踐精華

Java8函數OA現金盤平臺出租式編程實踐精華

資源共享 str 精華 tor menus new 細節 first ger

現在是OA現金盤平臺出租 haozbbs.com Q1446595067 資源共享的時代,同樣也是知識分享的時代,如果你覺得本文能學到知識,請把知識與別人分享。

緒論

從java8開始,我們就可以通過java8中的StrameAPI與Lambda表達式實現函數式編程,可以讓代碼變得更加高效簡潔。

現在很多企業的生產代碼已經開始使用java8了,對於還沒有使用過java8進行的編程的朋友們可以好好的學習一下,我在企業中寫java8也有一段時間了,我想把我在實際開發中用到的一些場景與大家分享一下,大部分例子都來源於我開發項目中的實例。

其中我開發中用得比較多的是,Optional,SteameAPI與lambda。本文是實戰帖,不做過多理論分析,直接講場景與應用。Java9已經出來一段時間了,我發現我周圍的很多做開發的朋友對java8中的一些新特性仍然不是很了解,也沒在生產代碼中使用過java8,不過我相信,很快,大部分公司都會用上java8的,我覺得java8與java5一樣,是jdk歷史上重要的一個版本更新,能給java編程帶來巨大變化的一個版本。

場景

1、數據類型轉換

直接上代碼

//拿到所有的processNumber
List<String> processNumbers = param.getListProcessNumbers().stream().
map(QueryStateData::getProcessNumber).collect(Collectors.toList());

上面的代碼的作用中把List<Object>,把其中我們需要的一個string字段變成List<String>,map是StringAPI中用來做數據類型轉換的。

QueryStateData::getProcessNumber是方法引用,作用與object->object.getProcessNumber();一樣,collect是收集器,通過收集器,把流轉換成我們想要的List<String>。

2、對List數據進行數據篩選

//獲取paymentChange
Optional<GaPaymentChange> changeOptional = listPaymentChange.stream().filter(p -> p.getTransferNo().equals(std.getProcessNumber())).findFirst();
if(changeOptional.isPresent()){
GaPaymentChange paymentChange = changeOptional.get();
}

filter從名字上看,就知道是用來過數據過濾的,filter的函數式接口中需返回一個boolean值。findFirst是取其中的第一個,可以返回一個Optional對象。通過get方法我們很輕松的拿到了我們想要的結果。

3.Optional對象的應用

java8中Optional的出現是為了減少空指針異常的。看代碼應用:

BigDecimal bigAbmout = Optional.ofNullable(paymentChange.getPaymentChangeMoney()).orElseGet(() -> new BigDecimal("0")).setScale(2, BigDecimal.ROUND_HALF_UP);

當ofNullable值為null時,我們可以給bigAbmout賦一個默認值。orElseGet的傳參數是一個函數式接口,上面代碼可以把它寫成

lambda要返回一個對象。

Optional.ofNullable(paymentChange.getPaymentChangeMoney()).orElse(new BigDecimal("0")).setScale(2, BigDecimal.ROUND_HALF_UP);

orElse與orElseGet不同的是,它的參數直接是目標對象。

4.StreamAPI遍歷對象

page.getRows().stream().forEach(x -> x.setOrderTime((DateUtils.dateFormat(x.getCreateTime(),DateUtils.DAT_SHORT_FORMATSS))));

上面的代碼就是簡單的把集合對象中orderTime的值做一下轉換。

5.快速找到集合中想要匹配數據

//是否存在增補單
boolean match = gaPaymentChangeDetailList.stream().anyMatch(detail -> GaConstants.SUPPLEMENT_BILL.equals(detail.getIsSupplementBill()));

anyMatch配合lambda表達式可以在集合中快速找到我們想匹配的數據。

6.List中對象轉換

List<Menu>menus= menuService.queryMenuList(query);List<MenuTreeVO> menuTrees = menus.stream().map(MenuTreeVO::new).collect(Collectors.toList());

利用StreamAPI兩行代碼就把List<Menu>轉成了 List<MenuTreeVO>,其中的map(MenuTreeVO::new)等價於map(menu->new MenuTreeVO(menu)),所以,實現的一個另一個細節,我重寫了MenuTreeVO的構造方法:

public MenuTreeVO(Menu menu) {
this.id = menu.getId();
this.pId = menu.getParentId();
this.name = menu.getName();
this.open = true;
}

7.枚舉中的應用

枚舉中我們通常會與一個靜態方法通過code去獲取它對應的枚舉,沒有用java8我們一般是通過for循環實現的,看看java8代碼:

/**

  • 獲取枚舉
  • @param code
  • @return
    */
    public static OrderStateEnum getEnum(Integer code) {
    return Stream.of(OrderStateEnum.values()).filter(e ->e.code.equals(code)).findFirst().orElse(null);
    }

8.lambda實現函數式接口

我們原來代碼中的遇到的函數式接口,我們就可以用lambda來代替,簡單的來說,就是new接口的地方。比如MQ發消息,我們傳統的做法:

jmsTemplate.send(new MessageCreator() { @Override
public Message createMessage(Session session) throws JMSException { return session.createTextMessage(String.valueOf(id));
}
});

這個函數式接口可以用lambda一行代碼輕松實現:

jmsTemplate.send(session -> session.createTextMessage(String.valueOf(id)));

8.去重、求和、最大值、最小值

用法都比較類似,這裏就不一一列舉了。下面看一個去重的。stream下面的方法也就那麽多個,要用的時候可以一個個點來看看,從英文意思我們可大概知道那些方法基本上用來做什麽的了。其實很多用法我也是在實際開發中慢慢研究出來的,也沒看很多的資源。

List<Color> colors = skusResult.getValue().stream().map(Sku::getColor).distinct().collect(Collectors.toList());

上面是對List<Color>中的Color對象去重,記得重寫hashCode()與equeals()方法。

結語

在實際的開發中,能應用的場景還有很多,我上面列舉的一些可能用得會相對多一些,也有很多應用場景我沒有提到,java8函數式編程的也許遠遠不止這些,以後遇到好的場景我再補充,如果大家有好的應用,歡迎留言討論。

哈 博小夥伴一開心 博主收集了一套很不錯java學習視頻教程 在這裏送給大家 在公眾號內回復 “java” 即可獲取奧

640?wx_fmt=png

Java8函數OA現金盤平臺出租式編程實踐精華