获取Stream流的方式 1Stream<E> stream(): 获取Collection集合对象的Stream流对象
可以是ArrayList/LinkedList/HashSet/LinkedHashSet对象
2获取数组对应的Stream流对象 of(T... values): 获取方法可变参数对应的Stream流对象
参数列表: T... values: 可变参数,可以传递参数列表,可以传递数组,还可以不传参
### Stream的forEach方法 对Stream流对象中的元素遍历 传递匿名内部类对象 传递lambda表达式
Stream<T> filter 判断型型接口,传递匿名内部类对象,lambda表达式 根据T类型的数据获取boolean类型的结果
Stream<T> long count(): 获取Stream流对象中的元素的个数
注意: 此方法没有参数,调用时不需要传递参数,根不能再写lambda表达式了
Stream<T> Stream<T> limit(long n): 获取Stream流对象中的前n个元素,返回一个新的Stream流对象 Stream<T> skip(long n): 跳过Stream流对象中的前n个元素,返回一个新的Stream流对象
共同的参数: long n: 表示数字
练习: 步骤一: 只要前7个 Stream<String> s2 = s.limit(7);
步骤二: 跳过前4个 Stream<String> s3 = s2.skip(4);
步骤三: 遍历输出
Stream<T> concat(Stream<T> a, Stream<T> b):
把方法参数指定的两个Stream流对象合并成一个Stream流对象返回
String str = "hello"; str = str.concat("world");
Stream<R> map(Function<T, R> mapper)流中的元素映射到另一个流中
该方法需要一个Function函数式接口参数,可以将当前流中的T类型数据转换为另一种R类型的流.
按照方法参数mapper指定的方式把Stream流对象中的T类型的元素转换成R类型,返回新的Stream流
apply(T t)根据方法参数T类型的t,获取R类型的数据 转换前:T类型apply(String personInfo) 转换后: R类型
public class Demo02GetStream {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
Stream<String> s1 = list.stream();
System.out.println(s1);
Set<Integer> set = new HashSet<>();
Stream<Integer> s2 = set.stream();
System.out.println(s2);
Map<String,String> map = new HashMap<>();
Set<String> set2 = map.keySet();
Stream<String> s3 = set2.stream();
System.out.println(s3);
Collection<String> coll = map.values();
Stream<String> s4 = coll.stream();
System.out.println(s4);
Set<Map.Entry<String, String>> set3 = map.entrySet();
Stream<Map.Entry<String, String>> s5 = set3.stream();
System.out.println(s5);
System.out.println("---------------------");
String[] arr = {"张无忌", "张翠山", "张三丰", "张一元"};
Stream<String> s6 = Stream.of(arr);
System.out.println(s6);
Stream<String> s7 = Stream.of("大娃", "二娃", "三娃", "四娃", "五娃", "六娃", "七娃", "爷爷", "蛇精", "蝎子精");
System.out.println(s7);
}
}
public class Demo03ForEach {
public static void main(String[] args) {
Stream<String> s = Stream.of("大娃", "二娃", "三娃", "四娃", "五娃", "六娃", "七娃", "爷爷", "蛇精", "蝎子精");
s.forEach((String name)->{
System.out.println(name);
});
}
}
public class Demo07CollectionForeach {
public static void main(String[] args) {
Collection<String> coll = new ArrayList<>();
Collections.addAll(coll, "Hello", "Java", "C++", "Python");
coll.forEach(new Consumer<String>() {
@Override
public void accept(String s) {
System.out.println(s);
}
});
coll.forEach((String s)->{
System.out.println(s);
});
}
}
/Map集合的forEach方法
public class Demo08MapForeach {
public static void main(String[] args) {
Map<String, String> map = new HashMap<>();
map.put("邓超", "孙俪");
map.put("李晨", "范冰冰");
map.put("刘德华", "柳岩");
map.forEach(new BiConsumer<String, String>() {
@Override
public void accept(String key, String value) {
System.out.println(key + "::::" + value);
}
});
map.forEach((String key, String value) -> {
System.out.println(key + "==" + value);
});
map.forEach((key, value) -> System.out.println(key + "==" + value));
}
}
练习: 步骤一: 过滤出所有带娃的 步骤二: 遍历输出结果
public class Demo04Filter {
public static void main(String[] args) {
Stream<String> s = Stream.of("大娃", "二娃", "三娃", "四娃", "五娃", "六娃", "七娃", "爷爷", "蛇精", "蝎子精");
Stream<String> s2 = s.filter((String name) -> {
return name.contains("娃");
});
s2.forEach((String name)->{
System.out.println(name);
});
}
}
Stream<T> long count(): 获取Stream流对象中的元素的个数
注意: 此方法没有参数,调用时不需要传递参数,根不能再写lambda表达式了
public class Demo05Count {
public static void main(String[] args) {
Stream<String> s = Stream.of("大娃", "二娃", "三娃", "四娃", "五娃", "六娃", "七娃", "爷爷", "蛇精", "蝎子精");
long num = s.count();
System.out.println("Stream流对象中的元素的个数: "+num);
}
}
Stream流综合练习
要求:
1. 第一个队伍只要名字为3个字的成员姓名;
2. 第一个队伍筛选之后只要前3个人;
3. 第二个队伍只要姓张的成员姓名;
4. 第二个队伍筛选之后不要前2个人;
5. 将两个队伍合并为一个队伍;
6. 打印整个队伍的姓名信息。
按照Stream流 + lambda表达式标准格式
*/
public class Demo04StreamTest {
public static void main(String[] args) {
List<String> o = new ArrayList<>();
o.add("迪丽热巴");
o.add("宋远桥");
o.add("苏星河");
o.add("老子");
o.add("庄子");
o.add("孙子");
o.add("洪七公");
Stream<String> os1 = o.stream();
Stream<String> os2 = os1.filter((String name) -> {
return name.length() == 3;
});
Stream<String> os3 = os2.limit(3);
List<String> t = new ArrayList<>();
t.add("古力娜扎");
t.add("张无忌");
t.add("张三丰");
t.add("赵丽颖");
t.add("张二狗");
Stream<String> ts1 = t.stream();
Stream<String> ts2 = ts1.filter((String name) -> {
return name.startsWith("张");
});
Stream<String> ts3 = ts2.skip(2);
Stream<String> ots3 = Stream.concat(os3, ts3);
ots3.forEach((String name)->{
System.out.println(name);
});
}
}
public class Demo08StreamMap {
public static void main(String[] args) {
List<String> strList = new ArrayList<>();
Collections.addAll(strList,"张三:18","李四:38","王五:28");
strList.stream()
.map((String personInfo)->{
String[] array = personInfo.split(":");
return new Person(array[0], Integer.parseInt(array[1]));
})
.forEach((Person p)->{
System.out.println(p);
});
}
}
对流操作完成之后,如果需要将结果进行收集,例如获取对应的集合/数组等,如何操作?
list = Stream流对象.collect(Collectors.toList());
set = Stream流对象.collect(Collectors.toSet());转换为Set集合
Stream流对象中的内容收集到数组中: Object[] toArray()
public class Demo09StreamCollect {
public static void main(String[] args) {
List<Person> list = new ArrayList<>();
Collections.addAll(list,
new Person("张三", 18),
new Person("李四", 38),
new Person("王五", 28));
Stream<Person> s = list.stream();
Stream<Person> s2 = s.map(new Function<Person, Person>() {
@Override
public Person apply(Person person) {
person.setAge(person.getAge() + 2);
return person;
}
});
list = Stream流对象.collect(Collectors.toList());
list = list.stream().map((Person person) -> {
person.setAge(person.getAge() + 2);
return person;
}).collect(Collectors.toList());
list.forEach(p-> System.out.println(p));
}
}
public class Demo04Filter {
public static void main(String[] args) {
Stream<String> s = Stream.of("大娃", "二娃", "三娃", "四娃", "五娃", "六娃", "七娃", "爷爷", "蛇精", "蝎子精");
Object【】 objArray=stream.toArray();
}
}