先贴实体类
package com.gant.model;
import java.util.List;
public class Article {
private String title;
private String content;
private String autor;
private List<String>tags;
public Article(String title, String content, String autor, List<String>tags) {
this.title=title;
this.content=content;
this.autor=autor;
this.tags=tags;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getAutor() {
return autor;
}
public void setAutor(String autor) {
this.autor = autor;
}
public List<String> getTags() {
return tags;
}
public void setTags(List<String> tags) {
this.tags = tags;
}
}
package com.gant.model;
public class Person {
private String firstName, lastName, job, gender;
private int salary, age;
public Person(String firstName, String lastName, String job,
String gender, int age, int salary) {
this.firstName = firstName;
this.lastName = lastName;
this.gender = gender;
this.age = age;
this.job = job;
this.salary = salary;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getJob() {
return job;
}
public void setJob(String job) {
this.job = job;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public int getSalary() {
return salary;
}
public void setSalary(int salary) {
this.salary = salary;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
Article实体类:
package com.gant.model;
import java.util.List;
public class Article {
private String title;
private String content;
private String autor;
private List<String>tags;
public Article(String title, String content, String autor, List<String>tags) {
this.title=title;
this.content=content;
this.autor=autor;
this.tags=tags;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getAutor() {
return autor;
}
public void setAutor(String autor) {
this.autor = autor;
}
public List<String> getTags() {
return tags;
}
public void setTags(List<String> tags) {
this.tags = tags;
}
}
方法主体:
package com.gant.service;
import java.util.ArrayList;
import java.util.IntSummaryStatistics;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import java.util.stream.Stream;
import com.gant.model.Article;
import com.gant.model.Person;
/**
*
* 当一个方法或者变量需要初始化加载,或者是经常被调用的时候可以加上static
*
* @ClassName StreamFilterDemo
* @Description StreamFilter实例
* @author chao
* @date 2017年12月20日
* @version 1.0
*/
public class StreamFilterDemo {
public static void main(String[] args) {
// getFirstJavaArticle();
// getDistinctTags();
// mapToIntTest();
// filterDemo();
// mapDemo();
// mapToIntDemo();
distinctDemo();
}
/**
* 用于过滤 用于在一堆数据中筛选出想要的数据,符合要求的数据
*
* @Description filter方法的案例 void
*/
public static void filterDemo() {
List<String> wordList = new ArrayList<String>() {
{
add("Elsdon");
add("Tamsen");
add("Floyd");
add("Sindydg");
add("Vere");
add("Maudeghjj");
}
};
Stream<String> words = wordList.stream();
Stream<String> longWords = words.filter(w -> w.length() > 6); // 过滤筛选数据 T->Boolean
// System.out.println(longWords.collect(Collectors.toSet()));
// //和下面的语句不能同时使用,因为只能被读取一次。
longWords.forEach((longwd) -> System.out.println(longwd));
}
/**
* 用于需要对一个流中的值进行某种形式的转换。如下代码:将所有单词转换为小写形式
*
* @Description map方法案例 void
*/
public static void mapDemo() {
List<String> wordList = new ArrayList<String>() {
{
add("Elsdon");
add("Tamsen");
add("Floyd");
add("Sindydg");
add("Vere");
add("Maudeghjj");
}
};
Stream<String> words = wordList.stream();
// Stream<String> lowercaseWords = words.map(String::toLowerCase); //java的 “双冒号”
// 写法 :方法引用 ,等同于下面语句
Stream<String> lowercaseWords = words.map((String str) -> str.toLowerCase());// name -> name.toLowerCase()
lowercaseWords.forEach((lw) -> System.out.println("转换后的结果是:" + lw)); // 遍历输出 foreach后面的兰布达方法表达式不能用括号括住
}
/**
* mapToDouble 和mapToLong同样试用
*
* @Description 从复合类型中获取简单的基本类型数据,创建流对象。 void
*/
public static void mapToIntDemo() {
List<Person> people = getPersonList();
IntStream peopleStream = people.stream().mapToInt(p -> p.getAge()); // 将Stream得到的流中的数据转换为int
int sum = peopleStream.sum();
// peopleStream.forEach((ps)->System.out.println(ps+"---")); // 遍历输出
// foreach后面的兰布达方法表达式不能用括号括住
System.out.println("总年龄是: " + sum);
}
/**
* 用于业务中需要去重操作(注:此过滤是对于无序结果不稳定)
*
* @Description 流的去重 void
*/
public static void distinctDemo() {
List<Person> people = getPersonList();
// Stream<Person> peopleStream = people.stream();
// Stream<String> peopleStreamNew = peopleStream.map((person) ->
// person.getJob().toLowerCase()).distinct().sorted(); //过滤操作.distinct().count()
/*
* List<String> peopleStreamSorted = peopleStream.map((person) ->
* person.getJob().toLowerCase()).distinct() .sorted((n1, n2) ->
* n1.compareTo(n2)).limit(10).skip(1).collect(Collectors.toList());
*/ // n2.compareTo(n1)表示倒序排
Map<Integer, String> personMap = people.stream().collect(Collectors.toMap(Person::getAge, Person::getJob)); // 此处特别需要注意:键不能有重复的,否则会报错
System.out.println(personMap);
// long number = peopleStreamNew.count();
// peopleStream.findFirst(); //找到第一个
// peopleStream.forEach((ps)->System.out.println(ps));
/*
* peopleStreamSorted.forEach((ps) -> System.out.println(ps));
* System.out.println(peopleStreamSorted);
*/
// long number = peopleStream.count();
}
public static Optional<Article> getFirstJavaArticle() {
List<Article> articles = getArticleList();
Optional<Article> print = articles.stream().filter(article -> article.getTags().contains("java")).findFirst();
System.out.println(print);
return articles.stream().filter(article -> article.getTags().contains("Java")).findFirst();
}
public static Set<String> getDistinctTags() {
List<Article> articles = getArticleList();
Set<String> print = articles.stream().flatMap(article -> article.getTags().stream())
.collect(Collectors.toSet());
System.out.println(print);
return articles.stream().flatMap(article -> article.getTags().stream()).collect(Collectors.toSet());
}
public static List<Person> getPersonList() {
@SuppressWarnings("serial")
List<Person> people = new ArrayList<Person>() {
{
add(new Person("Elsdon", "Jaycob", "Java programmer", "male", 43, 2000));
add(new Person("Elsdon", "Jaycob", "Java programmer", "male", 43, 2000));
add(new Person("Tamsen", "Brittany", "PHP programmer", "female", 23, 1500));
add(new Person("Floyd", "Donny", "PHP programmer", "male", 33, 1800));
add(new Person("Sindy", "Jonie", "PHP programmer", "female", 32, 1600));
add(new Person("Vere", "Hervey", "Java programmer", "male", 22, 1200));
add(new Person("Maude", "Jaimie", "PHP programmer", "female", 27, 1900));
add(new Person("Shawn", "Randall", "Java programmer", "male", 30, 2300));
add(new Person("Jayden", "Corrina", "Java programmer", "female", 35, 1700));
add(new Person("Palmer", "Dene", "Java programmer", "male", 33, 2000));
add(new Person("Addison", "Pam", "Java programmer", "female", 34, 1300));
}
};
return people;
}
public static List<Article> getArticleList() {
List<Article> articles = new ArrayList<>();
List<String> tagsList = new ArrayList<>();
tagsList.add("java");
tagsList.add("php");
tagsList.add("ios");
tagsList.add("c++");
articles.add(new Article("adsf", "adf", "adfsa", tagsList));
articles.add(new Article("as", "adsddf", "hg", tagsList));
articles.add(new Article("rtry", "hf", "avbdfsa", tagsList));
return articles;
}
public static void mapToIntTest() {
List<Person> persons = new ArrayList<Person>() {
{
add(new Person("Elsdon", "Jaycob", "Java programmer", "male", 43, 2000));
add(new Person("Tamsen", "Brittany", "Java programmer", "female", 23, 1500));
add(new Person("Floyd", "Donny", "Java programmer", "male", 33, 1800));
add(new Person("Sindy", "Jonie", "Java programmer", "female", 32, 1600));
add(new Person("Vere", "Hervey", "Java programmer", "male", 22, 1200));
add(new Person("Maude", "Jaimie", "Java programmer", "female", 27, 1900));
add(new Person("Shawn", "Randall", "Java programmer", "male", 30, 2300));
add(new Person("Jayden", "Corrina", "Java programmer", "female", 35, 1700));
add(new Person("Palmer", "Dene", "Java programmer", "male", 33, 2000));
add(new Person("Addison", "Pam", "Java programmer", "female", 34, 1300));
}
};
// mapToInt 返回一个IntStream ,其中包含将给定函数应用于此流的元素的结果。返回的是新的流。
IntSummaryStatistics intSummaryStatistics = persons.stream().mapToInt(person -> person.getAge())
.summaryStatistics();
System.out.println("最大年龄:" + intSummaryStatistics.getMax()); // 最大值
System.out.println("最小年龄:" + intSummaryStatistics.getMin()); // 最小值
System.out.println("年龄总和:" + intSummaryStatistics.getSum()); // 总计
System.out.println("人数:" + intSummaryStatistics.getCount()); // 个数
System.out.println("平均年龄:" + intSummaryStatistics.getAverage());// 平均数返回的是double类型
}
}