導航:首頁 > 編程語言 > java8mapstream

java8mapstream

發布時間:2022-11-03 11:42:47

Ⅰ 怎麼用java8 lamada 提取集合中每個對象的屬性

要提取屬性的話,用Stream中的map,然後使用方法引用,就可以了。

Ⅱ Java8 新特性 stream().map 能不能跳過元素 ,相當於continue的作用

你好,很高興回答你的問題。
stream()可以調用filter方法,可以用來過濾只保留符合條件的數據,相當於是循環到不符合條件的數據時continue。
如果有幫助到你請點擊採納。

Ⅲ java,請問換成java8 stream的寫法

List<List<Double>> lists = new ArrayList<>();
lists.add(Arrays.asList(1D,2D));
lists.add(Arrays.asList(3D,4D));
List<Double> collect = lists.stream().flatMap(a -> a.stream()).collect(Collectors.toList());
System.out.println(collect);

Ⅳ Java8 Stream中小弟我怎麼對多個欄位分組

在介紹Java 8的流(Stream)時,我們學會了一些集合操作的實用技巧。現在我們要看看怎樣把這些循環轉換為更簡潔,可讀性更高的代碼。

開始編碼!

好吧,講的夠多了,是時候展示一些例子了!

這次我們要以文章為例子。一篇文章擁有一個標題,一個作者和幾個標簽。

private class Article {

private final String title;
private final String author;
private final List<String> tags;

private Article(String title, String author, List<String> tags) {
this.title = title;
this.author = author;
this.tags = tags;
}

public String getTitle() {
return title;
}

public String getAuthor() {
return author;
}

public List<String> getTags() {
return tags;
}
}

每個例子都會包含一個使用傳統循環的方案和一個使用Java 8新特性的方案。

在第一個例子里,我們要在集合中查找包含「Java」標簽的第一篇文章。

看一下使用for循環的解決方案。

public Article getFirstJavaArticle() {

for (Article article : articles) {
if (article.getTags().contains("Java")) {
return article;
}
}

return null;
}

現在我們使用Stream API的相關操作來解決這個問題。

public Optional<Article> getFirstJavaArticle() {
return articles.stream()
.filter(article -> article.getTags().contains("Java"))
.findFirst();
}

是不是很酷?我們首先使用 filter 操作去找到所有包含Java標簽的文章,然後使用 findFirst()
操作去獲取第一次出現的文章。因為Stream是「延遲計算」(lazy)的並且filter返回一個流對象,所以這個方法僅在找到第一個匹配元素時才會
處理元素。

現在,讓我們獲取所有匹配的元素而不是僅獲取第一個。

首先使用for循環方案。

public List<Article> getAllJavaArticles() {

List<Article> result = new ArrayList<>();

for (Article article : articles) {
if (article.getTags().contains("Java")) {
result.add(article);
}
}

return result;
}

使用Stream操作的方案。

public List<Article> getAllJavaArticles() {
return articles.stream()
.filter(article -> article.getTags().contains("Java"))
.collect(Collectors.toList());
}

在這個例子里我們使用 collection 操作在返迴流上執行少量代碼而不是手動聲明一個集合並顯式地添加匹配的文章到集合里。

到目前為止還不錯。是時候舉一些突出Stream API強大的例子了。

根據作者來把所有的文章分組。

照舊,我們使用循環方案。

public Map<String, List<Article>> groupByAuthor() {

Map<String, List<Article>> result = new HashMap<>();

for (Article article : articles) {
if (result.containsKey(article.getAuthor())) {
result.get(article.getAuthor()).add(article);
} else {
ArrayList<Article> articles = new ArrayList<>();
articles.add(article);
result.put(article.getAuthor(), articles);
}
}

return result;
}

我們能否找到一個使用流操作的簡潔方案來解決這個問題?

public Map<String, List<Article>> groupByAuthor() {
return articles.stream()
.collect(Collectors.groupingBy(Article::getAuthor));
}

很好!使用 groupingBy 操作和 getAuthor 方法,我們得到了更簡潔、可讀性更高的代碼。

現在,我們查找集合中所有不同的標簽。

我們從使用循環的例子開始。

public Set<String> getDistinctTags() {

Set<String> result = new HashSet<>();

for (Article article : articles) {
result.addAll(article.getTags());
}

return result;
}

好,我們來看看如何使用Stream操作來解決這個問題。

public Set<String> getDistinctTags() {
return articles.stream()
.flatMap(article -> article.getTags().stream())
.collect(Collectors.toSet());
}

棒極了!flatmap 幫我把標簽列表轉為一個返迴流,然後我們使用 collect 去創建一個集合作為返回值。

一切皆有可能

以上的就是如何使用可讀性更高的代碼代替循環的例子。務必仔細看看Stream API,因為這篇文章僅僅提到它的一些皮毛而已。

Ⅳ Java9都快發布了,Java8的十大新特性你了解多少呢

一、Lambda表達式

Lambda表達式可以說是Java 8最大的賣點,她將函數式編程引入了Java。Lambda允許把函數作為一個方法的參數,或者把代碼看成數據。

一個Lambda表達式可以由用逗號分隔的參數列表、–>符號與函數體三部分表示。例如:

Arrays.asList( "p", "k", "u","f", "o", "r","k").forEach( e -> System.out.println( e ) );

1 Arrays.asList( "p", "k", "u","f", "o", "r","k").forEach( e -> System.out.println( e ) );

為了使現有函數更好的支持Lambda表達式,Java
8引入了函數式介面的概念。函數式介面就是只有一個方法的普通介面。java.lang.Runnable與java.util.concurrent.Callable是函數式介面最典型的例子。為此,Java
8增加了一種特殊的註解@FunctionalInterface:

1 @FunctionalInterface
2 public interface Functional {
3 void method();
4 }

二、介面的默認方法與靜態方法

我們可以在介面中定義默認方法,使用default關鍵字,並提供默認的實現。所有實現這個介面的類都會接受默認方法的實現,除非子類提供的自己的實現。例如:

1 public interface DefaultFunctionInterface {
2 default String defaultFunction() {
3 return "default function";
4 }
5 }

我們還可以在介面中定義靜態方法,使用static關鍵字,也可以提供實現。例如:

1 public interface StaticFunctionInterface {
2 static String staticFunction() {
3 return "static function";
4 }
5 }

介面的默認方法和靜態方法的引入,其實可以認為引入了C++中抽象類的理念,以後我們再也不用在每個實現類中都寫重復的代碼了。

三、方法引用

通常與Lambda表達式聯合使用,可以直接引用已有Java類或對象的方法。一般有四種不同的方法引用:

構造器引用。語法是Class::new,或者更一般的Class< T >::new,要求構造器方法是沒有參數;

靜態方法引用。語法是Class::static_method,要求接受一個Class類型的參數;

特定類的任意對象方法引用。它的語法是Class::method。要求方法是沒有參數的;

特定對象的方法引用,它的語法是instance::method。要求方法接受一個參數,與3不同的地方在於,3是在列表元素上分別調用方法,而4是在某個對象上調用方法,將列表元素作為參數傳入;

四、重復註解

在Java 5中使用註解有一個限制,即相同的註解在同一位置只能聲明一次。Java
8引入重復註解,這樣相同的註解在同一地方也可以聲明多次。重復註解機制本身需要用@Repeatable註解。Java
8在編譯器層做了優化,相同註解會以集合的方式保存,因此底層的原理並沒有變化。

五、擴展註解的支持

Java 8擴展了註解的上下文,幾乎可以為任何東西添加註解,包括局部變數、泛型類、父類與介面的實現,連方法的異常也能添加註解。

六、Optional

Java 8引入Optional類來防止空指針異常,Optional類最先是由Google的Guava項目引入的。Optional類實際上是個容器:它可以保存類型T的值,或者保存null。使用Optional類我們就不用顯式進行空指針檢查了。

七、Stream

Stream
API是把真正的函數式編程風格引入到Java中。其實簡單來說可以把Stream理解為MapRece,當然Google的MapRece的靈感也是來自函數式編程。她其實是一連串支持連續、並行聚集操作的元素。從語法上看,也很像linux的管道、或者鏈式編程,代碼寫起來簡潔明了,非常酷帥!

八、Date/Time API (JSR 310)

Java 8新的Date-Time API (JSR 310)受Joda-Time的影響,提供了新的java.time包,可以用來替代
java.util.Date和java.util.Calendar。一般會用到Clock、LocaleDate、LocalTime、LocaleDateTime、ZonedDateTime、Duration這些類,對於時間日期的改進還是非常不錯的。

九、JavaScript引擎Nashorn

Nashorn允許在JVM上開發運行JavaScript應用,允許Java與JavaScript相互調用。

十、Base64

在Java 8中,Base64編碼成為了Java類庫的標准。Base64類同時還提供了對URL、MIME友好的編碼器與解碼器。

除了這十大新特性之外,還有另外的一些新特性:

更好的類型推測機制:Java 8在類型推測方面有了很大的提高,這就使代碼更整潔,不需要太多的強制類型轉換了。

編譯器優化:Java 8將方法的參數名加入了位元組碼中,這樣在運行時通過反射就能獲取到參數名,只需要在編譯時使用-parameters參數。

並行(parallel)數組:支持對數組進行並行處理,主要是parallelSort()方法,它可以在多核機器上極大提高數組排序的速度。

並發(Concurrency):在新增Stream機制與Lambda的基礎之上,加入了一些新方法來支持聚集操作。

Nashorn引擎jjs:基於Nashorn引擎的命令行工具。它接受一些JavaScript源代碼為參數,並且執行這些源代碼。

類依賴分析器jdeps:可以顯示Java類的包級別或類級別的依賴。

JVM的PermGen空間被移除:取代它的是Metaspace(JEP 122)。

Ⅵ Java8,stream().map().collect(Collectors.toList()).forEach()和stream().map().forEach()有啥區別

在stream().map().collect(Collectors.toList()).forEach()中,你的forEach()針對的List;而
stream().map().forEach()針對的是Stream流。從結果操作來看是一樣的,中間過程回產生一些臨時變數。

Ⅶ Java8有哪些新特性

jdk1.8的新特性包括如下:
一、介面的默認方法與靜態方法,也就是介面中可以有實現方法
二、Lambda 表達式
三、函數式介面與靜態導入
四、Lambda 作用域

在lambda表達式中訪問外層作用域和老版本的匿名對象中的方式很相似。你可以直接訪問標記了final的外層局部變數,或者實例的欄位以及靜態變數。
五、訪問局部變數,等等其他新特性。

Ⅷ Java8 新特性中的Stream,如何按照條件替換原來stream中的數據

1、首先利用foreach()方法對Stream元素進行遍歷,如下圖所示。

Ⅸ java8 還需要groovy,嗎

需要。

閱讀全文

與java8mapstream相關的資料

熱點內容
自動解壓失敗叫我聯系客服 瀏覽:482
易語言新手源碼 瀏覽:456
oa伺服器必須有固定ip地址 瀏覽:42
傳奇源碼分析是什麼 瀏覽:267
解放壓縮機支架 瀏覽:255
程序員禿頂搞笑相遇 瀏覽:6
IBM手機app商店叫什麼名字 瀏覽:834
jpeg壓縮質量 瀏覽:774
雲伺服器評測對比 瀏覽:145
java日期轉string 瀏覽:221
openfire源碼編譯 瀏覽:897
在線小工具箱引流網站源碼 瀏覽:337
非科班程序員自學 瀏覽:801
壓縮泡沫鞋底底材 瀏覽:219
程序員職場第一課2正確的溝通 瀏覽:679
遇到不合法app應該怎麼辦 瀏覽:91
匯編程序編譯後的文件 瀏覽:80
大智慧均線源碼 瀏覽:374
單片機排阻的作用 瀏覽:216
滴滴金融app被下架如何還款 瀏覽:212