2016-10-01 3 views
-1

AssetLink 개체를 필터링하고 AssetLink의 대상인 Content 개체를 얻은 다음 Content 개체 기반의 ContentLinkMetadata 개체 필드를 설정하는 내 메서드를 리팩토링하고 싶습니다. .Java 8 - 메서드 맵이 인수에 적용되지 않습니다.

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; 
} 

그러나 나는 형 스트림에있어서, 맵이 인수 (표현형 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; 
} 
를 사용한다
관련 문제