2016-10-01 25 views
-1

私は、AssetLinkオブジェクトをフィルタリングし、AssetLinkのターゲットであるContentオブジェクトを取得し、Contentオブジェクトに基づくContentLinkMetadataオブジェクトのフィールドを設定するメソッドをリファクタリングしたいと考えました。 。私の新しい方法は、以下のようになります。Java 8 - メソッドマップは引数には適用されません(<noType>)

private List<ContentLinkMetadata> getAndFillInternalLinks(final Lesson lesson) { 
    List<ContentLinkMetadata> internalLinks = new ArrayList<>(); 
     lesson.getAssetLinks().stream() 
     .filter(linkAsAssetLink -> ALLOWED_INTERNAL_LINK_TYPES.contains(linkAsAssetLink.getTargetType())) 
     .map(linkAsAssetLink -> { 
      Content link = contentProvider.getLazyById(linkAsAssetLink.getTargetId()); 
      ContentLinkMetadata internalLink = new ContentLinkMetadata(); 

      internalLink.setDescription(link.getDescription()); 
      internalLink.setId(link.getId()); 
      internalLink.setTitle(link.getTitle()); 
      internalLink.setFriendlyUrl(friendlyUrlResolver.makeUrl(link)); 
      internalLink.setTypeId(link.getTypeId()); 

      internalLinks.add(internalLink); 
     }); 

     return internalLinks; 
} 

しかし、私はタイプのストリームのメソッドマップが(NOTYPE linkAsAssetLink)の引数には適用されませんし、私はそれを理解していない」と言う.MAP上のエラーを取得しています。なぜ、LinkAsAssetLinkが「noType」であるのか、それは実際にAssetLinkであり、私はcontentProviderのメソッドでそのメソッドを使用できますか?

答えて

1

あなたが間違って使っているようです。次のようにします。

private List<ContentLinkMetadata> getAndFillInternalLinks(final Lesson lesson) { 
    List<ContentLinkMetadata> internalLinks = lesson.getAssetLinks().stream() 
     .filter(linkAsAssetLink -> ALLOWED_INTERNAL_LINK_TYPES.contains(linkAsAssetLink.getTargetType())) 
     .map(linkAsAssetLink -> { 
      Content link = contentProvider.getLazyById(linkAsAssetLink.getTargetId()); 
      ContentLinkMetadata internalLink = new ContentLinkMetadata(); 

      internalLink.setDescription(link.getDescription()); 
      internalLink.setId(link.getId()); 
      internalLink.setTitle(link.getTitle()); 
      internalLink.setFriendlyUrl(friendlyUrlResolver.makeUrl(link)); 
      internalLink.setTypeId(link.getTypeId()); 

      return internalLink; 
     }).collect(Collectors.toList()); 

     return internalLinks; 
} 

またはf oreach:

private List<ContentLinkMetadata> getAndFillInternalLinks(final Lesson lesson) { 
    List<ContentLinkMetadata> internalLinks = new ArrayList<>(); 
     lesson.getAssetLinks().stream() 
     .filter(linkAsAssetLink -> ALLOWED_INTERNAL_LINK_TYPES.contains(linkAsAssetLink.getTargetType())) 
     .map(linkAsAssetLink -> { 
      Content link = contentProvider.getLazyById(linkAsAssetLink.getTargetId()); 
      ContentLinkMetadata internalLink = new ContentLinkMetadata(); 

      internalLink.setDescription(link.getDescription()); 
      internalLink.setId(link.getId()); 
      internalLink.setTitle(link.getTitle()); 
      internalLink.setFriendlyUrl(friendlyUrlResolver.makeUrl(link)); 
      internalLink.setTypeId(link.getTypeId()); 

      return internalLink; 
     }).foreach(internalLinks::add); 

     return internalLinks; 
} 

マップは常に何かを返す必要があります。 return文は暗黙的に指定できますが、そこにあるはずです。

3

操作マップでかっこを使用する場合は、return演算子を使用する必要があります。あなたのコードは、この

private List<ContentLinkMetadata> getAndFillInternalLinks(final Lesson lesson) { 
List<ContentLinkMetadata> internalLinks = lesson.getAssetLinks().stream() 
    .filter(linkAsAssetLink -> ALLOWED_INTERNAL_LINK_TYPES.contains(linkAsAssetLink.getTargetType())) 
    .map(linkAsAssetLink -> { 
     Content link = contentProvider.getLazyById(linkAsAssetLink.getTargetId()); 
     ContentLinkMetadata internalLink = new ContentLinkMetadata(); 
     internalLink.setDescription(link.getDescription()); 
     internalLink.setId(link.getId()); 
     internalLink.setTitle(link.getTitle()); 
     internalLink.setFriendlyUrl(friendlyUrlResolver.makeUrl(link)); 
     internalLink.setTypeId(link.getTypeId()); 
     return internalLink; 
    }).collect(Collectors.toList()); 

}

またはこのコード

List<ContentLinkMetadata> internalLinks = lesson.getAssetLinks().stream() 
     .filter(linkAsAssetLink -> ALLOWED_INTERNAL_LINK_TYPES.contains(linkAsAssetLink.getTargetType())) 
     .map(linkAsAssetLink -> linkAsAssetLink.getTargetId()) 
     .filter(Objects::nonNull) 
     .map(function) 
     }).collect(Collectors.toList()) 


private Function<Object, ContentLinkMetadata> function = this::toInternalLink; 

private ContentLinkMetadata toInternalLink(Object linkAsAssetLink){ 
       Content link = contentProvider.getLazyById(linkAsAssetLink.getTargetId()); 
       ContentLinkMetadata internalLink = new ContentLinkMetadata(); 
       internalLink.setDescription(link.getDescription()); 
       internalLink.setId(link.getId()); 
       internalLink.setTitle(link.getTitle()); 
       internalLink.setFriendlyUrl(friendlyUrlResolver.makeUrl(link)); 
       internalLink.setTypeId(link.getTypeId()); 
       return internalLink; 
} 
を使用するようになっているはずです
関連する問題