2017-06-02 17 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と呼ばれています。コンパイラのメッセージ「ここに該当するgetTitles(T)をBlogPostで定義していないタイプ」は、何が間違っているかを正確に伝えます。

また、postsPerの種類は

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

罰金コンパイルする必要があり、Map<BlogPostType...ではなく、それとMap<String, ...

でなければなりません。別のノートで、あなたは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分のコードを見つめていた。辛抱強く指摘してくれてありがとう。ありがとう@ミシャ。 – Priyanka

関連する問題