From 504e4eab3e0daebcf7ccf7f854edbbd60b364ff9 Mon Sep 17 00:00:00 2001 From: Athou Date: Fri, 12 Dec 2014 10:06:23 +0100 Subject: [PATCH] rewrite using lambdas --- .../backend/dao/FeedCategoryDAO.java | 11 ++----- .../commafeed/backend/dao/FeedEntryDAO.java | 8 ++--- .../backend/dao/FeedSubscriptionDAO.java | 25 ++++---------- .../com/commafeed/backend/dao/GenericDAO.java | 12 ++----- .../commafeed/backend/dao/UserRoleDAO.java | 8 ++--- .../commafeed/backend/feed/FeedParser.java | 13 ++------ .../backend/feed/FeedRefreshUpdater.java | 6 ++-- .../com/commafeed/backend/feed/FeedUtils.java | 9 ++--- .../com/commafeed/backend/model/User.java | 7 +--- .../commafeed/backend/opml/OPMLExporter.java | 12 ++----- .../backend/service/FeedEntryTagService.java | 33 ++++--------------- .../service/FeedSubscriptionService.java | 9 ++--- .../com/commafeed/frontend/model/Entry.java | 10 ++---- .../frontend/resource/CategoryREST.java | 18 +++------- .../commafeed/frontend/resource/FeedREST.java | 13 ++------ 15 files changed, 44 insertions(+), 150 deletions(-) diff --git a/src/main/java/com/commafeed/backend/dao/FeedCategoryDAO.java b/src/main/java/com/commafeed/backend/dao/FeedCategoryDAO.java index 7b5aac2d..3e788974 100644 --- a/src/main/java/com/commafeed/backend/dao/FeedCategoryDAO.java +++ b/src/main/java/com/commafeed/backend/dao/FeedCategoryDAO.java @@ -2,6 +2,7 @@ package com.commafeed.backend.dao; import java.util.List; import java.util.Objects; +import java.util.stream.Collectors; import javax.inject.Inject; import javax.inject.Singleton; @@ -12,7 +13,6 @@ import com.commafeed.backend.model.FeedCategory; import com.commafeed.backend.model.QFeedCategory; import com.commafeed.backend.model.QUser; import com.commafeed.backend.model.User; -import com.google.common.collect.Lists; import com.mysema.query.types.Predicate; @Singleton @@ -54,14 +54,7 @@ public class FeedCategoryDAO extends GenericDAO { } public List findAllChildrenCategories(User user, FeedCategory parent) { - List list = Lists.newArrayList(); - List all = findAll(user); - for (FeedCategory cat : all) { - if (isChild(cat, parent)) { - list.add(cat); - } - } - return list; + return findAll(user).stream().filter(c -> isChild(c, parent)).collect(Collectors.toList()); } private boolean isChild(FeedCategory child, FeedCategory parent) { diff --git a/src/main/java/com/commafeed/backend/dao/FeedEntryDAO.java b/src/main/java/com/commafeed/backend/dao/FeedEntryDAO.java index 4c3fedd7..f58a4d62 100644 --- a/src/main/java/com/commafeed/backend/dao/FeedEntryDAO.java +++ b/src/main/java/com/commafeed/backend/dao/FeedEntryDAO.java @@ -1,6 +1,7 @@ package com.commafeed.backend.dao; import java.util.List; +import java.util.stream.Collectors; import javax.inject.Inject; import javax.inject.Singleton; @@ -15,7 +16,6 @@ import com.commafeed.backend.model.Feed; import com.commafeed.backend.model.FeedEntry; import com.commafeed.backend.model.QFeedEntry; import com.google.common.collect.Iterables; -import com.google.common.collect.Lists; import com.mysema.query.Tuple; import com.mysema.query.types.expr.NumberExpression; @@ -36,13 +36,9 @@ public class FeedEntryDAO extends GenericDAO { } public List findFeedsExceedingCapacity(long maxCapacity, long max) { - List list = Lists.newArrayList(); NumberExpression count = entry.id.countDistinct(); List tuples = newQuery().from(entry).groupBy(entry.feed).having(count.gt(maxCapacity)).limit(max).list(entry.feed.id, count); - for (Tuple tuple : tuples) { - list.add(new FeedCapacity(tuple.get(entry.feed.id), tuple.get(count))); - } - return list; + return tuples.stream().map(t -> new FeedCapacity(t.get(entry.feed.id), t.get(count))).collect(Collectors.toList()); } public int deleteOldEntries(Long feedId, long max) { diff --git a/src/main/java/com/commafeed/backend/dao/FeedSubscriptionDAO.java b/src/main/java/com/commafeed/backend/dao/FeedSubscriptionDAO.java index efcddd62..bcda4c1e 100644 --- a/src/main/java/com/commafeed/backend/dao/FeedSubscriptionDAO.java +++ b/src/main/java/com/commafeed/backend/dao/FeedSubscriptionDAO.java @@ -1,6 +1,8 @@ package com.commafeed.backend.dao; import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; import javax.inject.Inject; import javax.inject.Singleton; @@ -13,9 +15,7 @@ import com.commafeed.backend.model.FeedSubscription; import com.commafeed.backend.model.Models; import com.commafeed.backend.model.QFeedSubscription; import com.commafeed.backend.model.User; -import com.google.common.base.Function; import com.google.common.collect.Iterables; -import com.google.common.collect.Lists; import com.mysema.query.jpa.hibernate.HibernateQuery; @Singleton @@ -60,26 +60,13 @@ public class FeedSubscriptionDAO extends GenericDAO { } public List findByCategories(User user, List categories) { - List categoryIds = Lists.transform(categories, new Function() { - @Override - public Long apply(FeedCategory input) { - return input.getId(); - } - }); - - List subscriptions = Lists.newArrayList(); - for (FeedSubscription sub : findAll(user)) { - if (sub.getCategory() != null && categoryIds.contains(sub.getCategory().getId())) { - subscriptions.add(sub); - } - } - return subscriptions; + Set categoryIds = categories.stream().map(c -> c.getId()).collect(Collectors.toSet()); + return findAll(user).stream().filter(s -> s.getCategory() != null && categoryIds.contains(s.getCategory().getId())) + .collect(Collectors.toList()); } private List initRelations(List list) { - for (FeedSubscription sub : list) { - initRelations(sub); - } + list.forEach(s -> initRelations(s)); return list; } diff --git a/src/main/java/com/commafeed/backend/dao/GenericDAO.java b/src/main/java/com/commafeed/backend/dao/GenericDAO.java index 338ada5f..f2217971 100644 --- a/src/main/java/com/commafeed/backend/dao/GenericDAO.java +++ b/src/main/java/com/commafeed/backend/dao/GenericDAO.java @@ -24,9 +24,7 @@ public abstract class GenericDAO extends AbstractDAO } public void saveOrUpdate(Collection models) { - for (T model : models) { - persist(model); - } + models.forEach(m -> persist(m)); } public void merge(T model) { @@ -34,9 +32,7 @@ public abstract class GenericDAO extends AbstractDAO } public void merge(Collection models) { - for (T model : models) { - merge(model); - } + models.forEach(m -> merge(m)); } public T findById(Long id) { @@ -50,9 +46,7 @@ public abstract class GenericDAO extends AbstractDAO } public int delete(Collection objects) { - for (T object : objects) { - delete(object); - } + objects.forEach(o -> delete(o)); return objects.size(); } diff --git a/src/main/java/com/commafeed/backend/dao/UserRoleDAO.java b/src/main/java/com/commafeed/backend/dao/UserRoleDAO.java index 883cd3ce..3c149499 100644 --- a/src/main/java/com/commafeed/backend/dao/UserRoleDAO.java +++ b/src/main/java/com/commafeed/backend/dao/UserRoleDAO.java @@ -2,6 +2,7 @@ package com.commafeed.backend.dao; import java.util.List; import java.util.Set; +import java.util.stream.Collectors; import javax.inject.Inject; import javax.inject.Singleton; @@ -12,7 +13,6 @@ import com.commafeed.backend.model.QUserRole; import com.commafeed.backend.model.User; import com.commafeed.backend.model.UserRole; import com.commafeed.backend.model.UserRole.Role; -import com.google.common.collect.Sets; @Singleton public class UserRoleDAO extends GenericDAO { @@ -33,10 +33,6 @@ public class UserRoleDAO extends GenericDAO { } public Set findRoles(User user) { - Set list = Sets.newHashSet(); - for (UserRole role : findAll(user)) { - list.add(role.getRole()); - } - return list; + return findAll(user).stream().map(r -> r.getRole()).collect(Collectors.toSet()); } } diff --git a/src/main/java/com/commafeed/backend/feed/FeedParser.java b/src/main/java/com/commafeed/backend/feed/FeedParser.java index 2e0f807f..29ebd60c 100644 --- a/src/main/java/com/commafeed/backend/feed/FeedParser.java +++ b/src/main/java/com/commafeed/backend/feed/FeedParser.java @@ -4,6 +4,7 @@ import java.io.StringReader; import java.text.DateFormat; import java.util.Date; import java.util.List; +import java.util.stream.Collectors; import javax.inject.Inject; import javax.inject.Singleton; @@ -19,10 +20,7 @@ import org.xml.sax.InputSource; import com.commafeed.backend.model.Feed; import com.commafeed.backend.model.FeedEntry; import com.commafeed.backend.model.FeedEntryContent; -import com.google.common.base.Function; -import com.google.common.collect.Collections2; import com.google.common.collect.Iterables; -import com.rometools.rome.feed.synd.SyndContent; import com.rometools.rome.feed.synd.SyndEnclosure; import com.rometools.rome.feed.synd.SyndEntry; import com.rometools.rome.feed.synd.SyndFeed; @@ -42,13 +40,6 @@ public class FeedParser { private static final Date START = new Date(86400000); private static final Date END = new Date(1000l * Integer.MAX_VALUE - 86400000); - private static final Function CONTENT_TO_STRING = new Function() { - @Override - public String apply(SyndContent content) { - return content.getValue(); - } - }; - public FetchedFeed parse(String feedUrl, byte[] xml) throws FeedException { FetchedFeed fetchedFeed = new FetchedFeed(); Feed feed = fetchedFeed.getFeed(); @@ -172,7 +163,7 @@ public class FeedParser { if (item.getContents().isEmpty()) { content = item.getDescription() == null ? null : item.getDescription().getValue(); } else { - content = StringUtils.join(Collections2.transform(item.getContents(), CONTENT_TO_STRING), System.lineSeparator()); + content = item.getContents().stream().map(c -> c.getValue()).collect(Collectors.joining(System.lineSeparator())); } return StringUtils.trimToNull(content); } diff --git a/src/main/java/com/commafeed/backend/feed/FeedRefreshUpdater.java b/src/main/java/com/commafeed/backend/feed/FeedRefreshUpdater.java index a36d4b77..394c3995 100644 --- a/src/main/java/com/commafeed/backend/feed/FeedRefreshUpdater.java +++ b/src/main/java/com/commafeed/backend/feed/FeedRefreshUpdater.java @@ -8,6 +8,7 @@ import java.util.Iterator; import java.util.List; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.Lock; +import java.util.stream.Collectors; import javax.inject.Inject; import javax.inject.Singleton; @@ -138,10 +139,7 @@ public class FeedRefreshUpdater implements Managed { } if (CollectionUtils.isNotEmpty(subscriptions)) { - List users = Lists.newArrayList(); - for (FeedSubscription sub : subscriptions) { - users.add(sub.getUser()); - } + List users = subscriptions.stream().map(s -> s.getUser()).collect(Collectors.toList()); cache.invalidateUnreadCount(subscriptions.toArray(new FeedSubscription[0])); cache.invalidateUserRootCategory(users.toArray(new User[0])); } diff --git a/src/main/java/com/commafeed/backend/feed/FeedUtils.java b/src/main/java/com/commafeed/backend/feed/FeedUtils.java index bb863a80..c3e617ee 100644 --- a/src/main/java/com/commafeed/backend/feed/FeedUtils.java +++ b/src/main/java/com/commafeed/backend/feed/FeedUtils.java @@ -9,6 +9,7 @@ import java.util.Date; import java.util.Iterator; import java.util.List; import java.util.regex.Pattern; +import java.util.stream.Collectors; import lombok.extern.slf4j.Slf4j; @@ -388,13 +389,7 @@ public class FeedUtils { } public static List getSortedTimestamps(List entries) { - List timestamps = Lists.newArrayList(); - for (FeedEntry entry : entries) { - timestamps.add(entry.getUpdated().getTime()); - } - Collections.sort(timestamps); - Collections.reverse(timestamps); - return timestamps; + return entries.stream().map(t -> t.getUpdated().getTime()).sorted(Collections.reverseOrder()).collect(Collectors.toList()); } public static String removeTrailingSlash(String url) { diff --git a/src/main/java/com/commafeed/backend/model/User.java b/src/main/java/com/commafeed/backend/model/User.java index 3b8a5126..d5070bd5 100644 --- a/src/main/java/com/commafeed/backend/model/User.java +++ b/src/main/java/com/commafeed/backend/model/User.java @@ -71,12 +71,7 @@ public class User extends AbstractModel { private Date lastFullRefresh; public boolean hasRole(Role role) { - for (UserRole userRole : getRoles()) { - if (userRole.getRole() == role) { - return true; - } - } - return false; + return getRoles().stream().anyMatch(r -> r.getRole() == role); } public boolean shouldRefreshFeedsAt(Date when) { diff --git a/src/main/java/com/commafeed/backend/opml/OPMLExporter.java b/src/main/java/com/commafeed/backend/opml/OPMLExporter.java index 7d6a22d1..07a1dfb0 100644 --- a/src/main/java/com/commafeed/backend/opml/OPMLExporter.java +++ b/src/main/java/com/commafeed/backend/opml/OPMLExporter.java @@ -13,7 +13,6 @@ import com.commafeed.backend.dao.FeedSubscriptionDAO; import com.commafeed.backend.model.FeedCategory; import com.commafeed.backend.model.FeedSubscription; import com.commafeed.backend.model.User; -import com.google.common.base.Function; import com.google.common.collect.Multimap; import com.google.common.collect.Multimaps; import com.rometools.opml.feed.opml.Attribute; @@ -24,13 +23,7 @@ import com.rometools.opml.feed.opml.Outline; @Singleton public class OPMLExporter { - private static Long ROOT_CATEGORY_ID = new Long(-1); - private static final Function SUBSCRIPTION_TO_CATEGORYID = new Function() { - @Override - public Long apply(FeedSubscription sub) { - return sub.getCategory() == null ? ROOT_CATEGORY_ID : sub.getCategory().getId(); - } - }; + private static Long ROOT_CATEGORY_ID = Long.valueOf(Long.MIN_VALUE); private final FeedCategoryDAO feedCategoryDAO; private final FeedSubscriptionDAO feedSubscriptionDAO; @@ -42,7 +35,8 @@ public class OPMLExporter { opml.setCreated(new Date()); List categories = feedCategoryDAO.findAll(user); - Multimap subscriptions = Multimaps.index(feedSubscriptionDAO.findAll(user), SUBSCRIPTION_TO_CATEGORYID); + Multimap subscriptions = Multimaps.index(feedSubscriptionDAO.findAll(user), + sub -> sub.getCategory() == null ? ROOT_CATEGORY_ID : sub.getCategory().getId()); // export root categories for (FeedCategory cat : categories) { diff --git a/src/main/java/com/commafeed/backend/service/FeedEntryTagService.java b/src/main/java/com/commafeed/backend/service/FeedEntryTagService.java index f640c045..446d027b 100644 --- a/src/main/java/com/commafeed/backend/service/FeedEntryTagService.java +++ b/src/main/java/com/commafeed/backend/service/FeedEntryTagService.java @@ -1,7 +1,8 @@ package com.commafeed.backend.service; import java.util.List; -import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; import javax.inject.Inject; import javax.inject.Singleton; @@ -13,9 +14,6 @@ import com.commafeed.backend.dao.FeedEntryTagDAO; import com.commafeed.backend.model.FeedEntry; import com.commafeed.backend.model.FeedEntryTag; import com.commafeed.backend.model.User; -import com.google.common.base.Function; -import com.google.common.collect.Lists; -import com.google.common.collect.Maps; @RequiredArgsConstructor(onConstructor = @__({ @Inject })) @Singleton @@ -30,29 +28,12 @@ public class FeedEntryTagService { return; } - List tags = feedEntryTagDAO.findByEntry(user, entry); - Map tagMap = Maps.uniqueIndex(tags, new Function() { - @Override - public String apply(FeedEntryTag input) { - return input.getName(); - } - }); + List existingTags = feedEntryTagDAO.findByEntry(user, entry); + Set existingTagNames = existingTags.stream().map(t -> t.getName()).collect(Collectors.toSet()); - List addList = Lists.newArrayList(); - List removeList = Lists.newArrayList(); - - for (String tagName : tagNames) { - FeedEntryTag tag = tagMap.get(tagName); - if (tag == null) { - addList.add(new FeedEntryTag(user, entry, tagName)); - } - } - - for (FeedEntryTag tag : tags) { - if (!tagNames.contains(tag.getName())) { - removeList.add(tag); - } - } + List addList = tagNames.stream().filter(name -> !existingTagNames.contains(name)) + .map(name -> new FeedEntryTag(user, entry, name)).collect(Collectors.toList()); + List removeList = existingTags.stream().filter(tag -> !tagNames.contains(tag.getName())).collect(Collectors.toList()); feedEntryTagDAO.saveOrUpdate(addList); feedEntryTagDAO.delete(removeList); diff --git a/src/main/java/com/commafeed/backend/service/FeedSubscriptionService.java b/src/main/java/com/commafeed/backend/service/FeedSubscriptionService.java index 950a7632..e47f96c4 100644 --- a/src/main/java/com/commafeed/backend/service/FeedSubscriptionService.java +++ b/src/main/java/com/commafeed/backend/service/FeedSubscriptionService.java @@ -2,6 +2,7 @@ package com.commafeed.backend.service; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; import javax.inject.Inject; import javax.inject.Singleton; @@ -23,7 +24,6 @@ import com.commafeed.backend.model.FeedSubscription; import com.commafeed.backend.model.Models; import com.commafeed.backend.model.User; import com.commafeed.frontend.model.UnreadCount; -import com.google.common.collect.Maps; @Slf4j @RequiredArgsConstructor(onConstructor = @__({ @Inject })) @@ -92,12 +92,7 @@ public class FeedSubscriptionService { } public Map getUnreadCount(User user) { - Map map = Maps.newHashMap(); - List subs = feedSubscriptionDAO.findAll(user); - for (FeedSubscription sub : subs) { - map.put(sub.getId(), getUnreadCount(user, sub)); - } - return map; + return feedSubscriptionDAO.findAll(user).stream().collect(Collectors.toMap(s -> s.getId(), s -> getUnreadCount(user, s))); } private UnreadCount getUnreadCount(User user, FeedSubscription sub) { diff --git a/src/main/java/com/commafeed/frontend/model/Entry.java b/src/main/java/com/commafeed/frontend/model/Entry.java index 1370f240..abdd9530 100644 --- a/src/main/java/com/commafeed/frontend/model/Entry.java +++ b/src/main/java/com/commafeed/frontend/model/Entry.java @@ -4,6 +4,7 @@ import java.io.Serializable; import java.util.Arrays; import java.util.Date; import java.util.List; +import java.util.stream.Collectors; import lombok.Data; @@ -11,9 +12,7 @@ import com.commafeed.backend.feed.FeedUtils; import com.commafeed.backend.model.FeedEntry; import com.commafeed.backend.model.FeedEntryContent; import com.commafeed.backend.model.FeedEntryStatus; -import com.commafeed.backend.model.FeedEntryTag; import com.commafeed.backend.model.FeedSubscription; -import com.google.common.collect.Lists; import com.rometools.rome.feed.synd.SyndContent; import com.rometools.rome.feed.synd.SyndContentImpl; import com.rometools.rome.feed.synd.SyndEnclosure; @@ -48,12 +47,7 @@ public class Entry implements Serializable { entry.setFeedUrl(sub.getFeed().getUrl()); entry.setFeedLink(sub.getFeed().getLink()); entry.setIconUrl(FeedUtils.getFaviconUrl(sub, publicUrl)); - - List tags = Lists.newArrayList(); - for (FeedEntryTag tag : status.getTags()) { - tags.add(tag.getName()); - } - entry.setTags(tags); + entry.setTags(status.getTags().stream().map(t -> t.getName()).collect(Collectors.toList())); if (content != null) { entry.setRtl(FeedUtils.isRTL(feedEntry)); diff --git a/src/main/java/com/commafeed/frontend/resource/CategoryREST.java b/src/main/java/com/commafeed/frontend/resource/CategoryREST.java index fd1859b9..4c1c76b4 100644 --- a/src/main/java/com/commafeed/frontend/resource/CategoryREST.java +++ b/src/main/java/com/commafeed/frontend/resource/CategoryREST.java @@ -3,6 +3,7 @@ package com.commafeed.frontend.resource; import io.dropwizard.hibernate.UnitOfWork; import java.io.StringWriter; +import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import java.util.Date; @@ -10,6 +11,7 @@ import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.stream.Collectors; import javax.inject.Inject; import javax.inject.Singleton; @@ -60,7 +62,6 @@ import com.commafeed.frontend.model.request.MarkRequest; import com.google.common.base.Optional; import com.google.common.base.Preconditions; import com.google.common.collect.Lists; -import com.rometools.rome.feed.synd.SyndEntry; import com.rometools.rome.feed.synd.SyndFeed; import com.rometools.rome.feed.synd.SyndFeedImpl; import com.rometools.rome.io.SyndFeedOutput; @@ -127,10 +128,7 @@ public class CategoryREST { List excludedIds = null; if (StringUtils.isNotEmpty(excludedSubscriptionIds)) { - excludedIds = Lists.newArrayList(); - for (String excludedId : excludedSubscriptionIds.split(",")) { - excludedIds.add(Long.valueOf(excludedId)); - } + excludedIds = Arrays.stream(excludedSubscriptionIds.split(",")).map(Long::valueOf).collect(Collectors.toList()); } if (ALL.equals(id)) { @@ -216,14 +214,8 @@ public class CategoryREST { feed.setFeedType("rss_2.0"); feed.setTitle("CommaFeed - " + entries.getName()); feed.setDescription("CommaFeed - " + entries.getName()); - String publicUrl = config.getApplicationSettings().getPublicUrl(); - feed.setLink(publicUrl); - - List children = Lists.newArrayList(); - for (Entry entry : entries.getEntries()) { - children.add(entry.asRss()); - } - feed.setEntries(children); + feed.setLink(config.getApplicationSettings().getPublicUrl()); + feed.setEntries(entries.getEntries().stream().map(e -> e.asRss()).collect(Collectors.toList())); SyndFeedOutput output = new SyndFeedOutput(); StringWriter writer = new StringWriter(); diff --git a/src/main/java/com/commafeed/frontend/resource/FeedREST.java b/src/main/java/com/commafeed/frontend/resource/FeedREST.java index a3d74903..95ae613a 100644 --- a/src/main/java/com/commafeed/frontend/resource/FeedREST.java +++ b/src/main/java/com/commafeed/frontend/resource/FeedREST.java @@ -12,6 +12,7 @@ import java.util.Comparator; import java.util.Date; import java.util.List; import java.util.Objects; +import java.util.stream.Collectors; import javax.inject.Inject; import javax.inject.Singleton; @@ -78,9 +79,7 @@ import com.commafeed.frontend.model.request.MarkRequest; import com.commafeed.frontend.model.request.SubscribeRequest; import com.google.common.base.Preconditions; import com.google.common.base.Throwables; -import com.google.common.collect.Lists; import com.rometools.opml.feed.opml.Opml; -import com.rometools.rome.feed.synd.SyndEntry; import com.rometools.rome.feed.synd.SyndFeed; import com.rometools.rome.feed.synd.SyndFeedImpl; import com.rometools.rome.io.SyndFeedOutput; @@ -218,14 +217,8 @@ public class FeedREST { feed.setFeedType("rss_2.0"); feed.setTitle("CommaFeed - " + entries.getName()); feed.setDescription("CommaFeed - " + entries.getName()); - String publicUrl = config.getApplicationSettings().getPublicUrl(); - feed.setLink(publicUrl); - - List children = Lists.newArrayList(); - for (Entry entry : entries.getEntries()) { - children.add(entry.asRss()); - } - feed.setEntries(children); + feed.setLink(config.getApplicationSettings().getPublicUrl()); + feed.setEntries(entries.getEntries().stream().map(e -> e.asRss()).collect(Collectors.toList())); SyndFeedOutput output = new SyndFeedOutput(); StringWriter writer = new StringWriter();