java8新特性

Java8不要再用循环了
stream api ----->取消for 循环
http://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html

一篇文章拥有一个标题,一个作者和几个标签。
Java代码
private class Article { 
  
        private final String title; 
        private final String author; 
        private final List<String> tags; 
  
        private Article(String title, String author, List<String> tags) { 
            this.title = title; 
            this.author = author; 
            this.tags = tags; 
        } 
  
        public String getTitle() { 
            return title; 
        } 
  
        public String getAuthor() { 
            return author; 
        } 
  
        public List<String> getTags() { 
            return tags; 
        } 
    } 

每个例子都会包含一个使用传统循环的方案和一个使用Java 8新特性的方案。

在第一个例子里,要在集合中查找包含“Java”标签的第一篇文章。

看一下使用for循环的解决方案。
Java代码
public Article getFirstJavaArticle() { 
  
    for (Article article : articles) { 
        if (article.getTags().contains("Java")) { 
            return article; 
        } 
    } 
  
    return null; 


使用Stream API的相关操作来解决这个问题。
Java代码
public Optional<Article> getFirstJavaArticle() {   
    return articles.stream() 
        .filter(article -> article.getTags().contains("Java")) 
        .findFirst(); 
    } 

首先使用 filter 操作去找到所有包含Java标签的文章,然后使用 findFirst() 操作去获取第一次出现的文章。因为Stream是“延迟计算”(lazy)的并且filter返回一个流对象,所以这个方法仅在找到第一个匹配元素时才会处理元素。

获取所有匹配的元素而不是仅获取第一个。

首先使用for循环方案。
Java代码
public List<Article> getAllJavaArticles() { 
  
    List<Article> result = new ArrayList<>(); 
  
    for (Article article : articles) { 
        if (article.getTags().contains("Java")) { 
            result.add(article); 
        } 
    } 
  
    return result; 


使用Stream操作的方案。
Java代码
public List<Article> getAllJavaArticles() {   
    return articles.stream() 
        .filter(article -> article.getTags().contains("Java")) 
        .collect(Collectors.toList()); 
    } 

在这个例子里我们使用 collection 操作在返回流上执行少量代码而不是手动声明一个集合并显式地添加匹配的文章到集合里。

举一些突出Stream API强大的例子了。



照旧,我们使用循环方案。
Java代码
public Map<String, List<Article>> groupByAuthor() { 
  
    Map<String, List<Article>> result = new HashMap<>(); 
  
    for (Article article : articles) { 
        if (result.containsKey(article.getAuthor())) { 
            result.get(article.getAuthor()).add(article); 
        } else { 
            ArrayList<Article> articles = new ArrayList<>(); 
            articles.add(article); 
            result.put(article.getAuthor(), articles); 
        } 
    } 
  
    return result; 


找到一个使用流操作的简洁方案来解决这个问题。
Java代码
public Map<String, List<Article>> groupByAuthor() {   
    return articles.stream() 
        .collect(Collectors.groupingBy(Article::getAuthor)); 


使用 groupingBy 操作和 getAuthor 方法,得到了更简洁、可读性更高的代码。

现在,查找集合中所有不同的标签。
从使用循环的例子开始。
Java代码
public Set<String> getDistinctTags() { 
  
    Set<String> result = new HashSet<>(); 
  
    for (Article article : articles) { 
        result.addAll(article.getTags()); 
    } 
  
    return result; 


使用Stream操作来解决这个问题。
Java代码
public Set<String> getDistinctTags() {   
    return articles.stream() 
        .flatMap(article -> article.getTags().stream()) 
        .collect(Collectors.toSet()); 

你可能感兴趣的:(java)