2017-06-02 84 views
1

這就是我想實現無法同時使用Java 8映射和maxBy操作

集團按類型的博客文章來糾正錯誤。在每種類型中,試圖產生標題的名稱並按最大長度減少。

這是我正在嘗試使用的以下邏輯。

BlogPost b1 = new BlogPost("Story behind Harry Potter", "J.K.Rowling", BlogPostType.FICTION, 100); 
    BlogPost b2= new BlogPost("Java 8 Tutorial", "Vinay", BlogPostType.TECH, 10); 
    BlogPost b3 = new BlogPost("Python Tutorial", "Jim", BlogPostType.TECH, 20); 
    BlogPost b4 = new BlogPost("Mission Impossible", "Kim", BlogPostType.REVIEW, 40); 
    BlogPost b5 = new BlogPost("Bomb Blast", "Kenny", BlogPostType.NEWS, 200); 
    BlogPost b6 = new BlogPost("President Visits", "Laura", BlogPostType.NEWS, 400); 
    List<BlogPost> posts = Arrays.asList(b1,b2,b3,b4,b5,b6); 

Map<String, Optional<String>> postsPer = posts.stream().collect(
      Collectors.groupingBy(BlogPost::getType, 
Collectors.mapping(BlogPost::getTitles, 
Collectors.maxBy(Comparator.comparing(String::length))))); 

而我無法弄清楚如何解決這個問題。 IDE將下面的線條指示爲紅色

mapping(BlogPost::getTitles 

以及下面提到的錯誤/標記顯示出我無法解決的問題。

Multiple markers at this line 
- The method mapping(Function<? super T,? extends U>, Collector<? super U,A,R>) in the type Collectors is not applicable for the arguments (BlogPost::getTitles, Collector<String,capture#60- 
of ?,Optional<String>>) 
- The type BlogPost does not define getTitles(T) that is applicable here 

下面是

package com.main.java8.streams.groupingby; 
class BlogPost { 
String title; 
String author; 
BlogPostType type; 
int likes; 
public String getTitle() { 
    return title; 
} 
public void setTitle(String title) { 
    this.title = title; 
} 
public String getAuthor() { 
    return author; 
} 
public void setAuthor(String author) { 
    this.author = author; 
} 
/*@Override 
public String toString() { 
    return "BlogPost [title=" + title + ", author=" + author + ", type=" + type + ", likes=" + likes + "]"; 
}*/ 
public BlogPostType getType() { 
    return type; 
} 
@Override 
public String toString() { 
    return "BlogPost [title=" + title + "]"; 
} 
public void setType(BlogPostType type) { 
    this.type = type; 
} 
public int getLikes() { 
    return likes; 
} 
public void setLikes(int likes) { 
    this.likes = likes; 
} 
public BlogPost(String title, String author, BlogPostType type, int likes) { 
    super(); 
    this.title = title; 
    this.author = author; 
    this.type = type; 
    this.likes = likes; 
} 

} 



package com.main.java8.streams.groupingby; 
enum BlogPostType { 
NEWS, 
REVIEW, 
GUIDE, 
FICTION, 
TECH 
} 
+0

我不完全明白是怎麼回事,但如果要我猜我會說'BlogPost :: getTitles'不是'Function <?超級T,?擴展U>' –

回答

3

BlogPost::getTitles以紅色突出顯示,因爲它是一個錯字類,你的方法被稱爲getTitle。編譯器的消息「類型BlogPost沒有定義在這裏適用的getTitles(T)」告訴你到底發生了什麼問題。

此外,中postsPer的類型應該是Map<BlogPostType...而非Map<String, ...

就這樣,

Map<BlogPostType, Optional<String>> postsPer = posts.stream().collect(
     Collectors.groupingBy(BlogPost::getType, 
      Collectors.mapping(BlogPost::getTitle, 
       Collectors.maxBy(Comparator.comparing(String::length))))); 

應該編譯罰款。

在另一方面,可以避開Optional,並用3個參數的toMap收藏家更直截了當地表達這一點:

import static java.util.stream.Collectors.toMap; 
import static java.util.Comparator.comparing; 

Map<BlogPostType, String> postsPer = posts.stream() 
     .collect(toMap(
       BlogPost::getType, 
       BlogPost::getTitle, 
       BinaryOperator.maxBy(comparing(String::length)) 
     )); 
+0

我覺得很尷尬。我一直盯着45分鐘的代碼,想着什麼是錯誤的,當時是Typo。非常感謝您耐心指出。謝謝@米沙。 – Priyanka