Stream接口
1,stream的foreach方法
Stream不是一个数据结构,不直接存储数据,它通过管道来操作数据。
创建Stream接口实现类对象:
stream():创建一个Stream接口实现类的对象:
Stream<Person> stream = People.stream();
使用方式:
先创建一个Person类:
package new_feature.stream;
public class Person {
public static enum Sex {
MALE, FEMALE
}
private String name;
private Sex gender;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Sex getGender() {
return gender;
}
public void setGender(Sex gender) {
this.gender = gender;
}
public Person(String name, Sex sex) {
this.name = name;
this.gender = sex;
}
@Override
public String toString() {
return "Person [name=" + name + ", gender=" + gender + "]";
}
}
测试类:
package new_feature.stream;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;
import new_feature.stream.Person.Sex;
public class StreamTest {
// 集合初始化
static List<Person> createPeople() {
List<Person> people = new ArrayList<Person>();
Person person1 = new Person("张飞", Sex.MALE);
Person person2 = new Person("关羽", Sex.MALE);
Person person3 = new Person("刘备", Sex.MALE);
people.add(person3);
people.add(person2);
people.add(person1);
return people;
}
}
main方法中的调用:
public static void main(String[] args) {
List<Person> people = createPeople();
Stream<Person> stream = people.stream();
stream.forEach(p -> System.out.println(p.toString()));
}
这样就可以一次打出person里的内容了。
2,stream的filter方法
先给people设置两类的值,一是male,一是female
// 集合初始化
static List<Person> createPeople() {
List<Person> people = new ArrayList<Person>();
Person person1 = new Person("张飞", Sex.MALE);
Person person2 = new Person("关羽", Sex.MALE);
Person person3 = new Person("刘备", Sex.MALE);
Person person4 = new Person("貂蝉", Sex.FEMALE);
Person person5 = new Person("黄月英", Sex.FEMALE);
people.add(person3);
people.add(person2);
people.add(person1);
people.add(person4);
people.add(person5);
return people;
}
然后在main方法中进行调用:
public static void main(String[] args) {
List<Person> people = createPeople();
people.stream().filter(p -> p.getGender() == Person.Sex.FEMALE).forEach(p -> System.out.println(p));
}
这样就可以实现,先选择出female类别的,在进行处理。
3,DoubleStream
DoubleStream接口表示元素类型是double的数据源
DoubleStream接口的常用方法:
(1)max().getAsDouble():获取流中数据集的最大值;
(2)stream.min().getAsDouble():获取数据流中数据集的最小值;
(3)stream.average():获取数据流中数据集的平均值;
修改person类,增加height字段:
private double height;
并增加一个构造方法:
public Person(String name, Sex sex, double height) {
this.name = name;
this.gender = sex;
this.height = height;
}
构造数据的函数:
// 集合初始化
static List<Person> createPeople() {
List<Person> people = new ArrayList<Person>();
Person person1 = new Person("张飞", Sex.MALE, 1.8);
Person person2 = new Person("关羽", Sex.MALE, 1.85);
Person person3 = new Person("刘备", Sex.MALE, 1.75);
Person person4 = new Person("貂蝉", Sex.FEMALE, 1.63);
Person person5 = new Person("黄月英", Sex.FEMALE, 1.65);
people.add(person3);
people.add(person2);
people.add(person1);
people.add(person4);
people.add(person5);
return people;
}
测试方法:
public static void main(String[] args) {
List<Person> people = createPeople();
double aveHeight = people.stream().filter(p -> p.getGender() == Person.Sex.MALE).mapToDouble(p -> p.getHeight()).average().getAsDouble();
System.out.println("所有男性的平均身高:" + aveHeight + "米");
}
是不是方便了很多,感觉java学习了动态语言的功能,强化了灵活性。