第一章: Stream流java
这里的 Stream,是在 Java 8 中,由于 Lambda 带来的函数式编程,引入的一个全新的 Stream 概念,用于解决已有集合中既有的弊端。算法
//传统的写法编程 public class Test1{数组 public static void main(String[] args) {数据结构 ArrayList<String>list=new ArrayList<>();app list.add("李文杰");函数式编程 list.add("李文集");函数 list.add("李文洁");spa list.add("王智雅");对象 list.add("何舒雅"); list.add("王文文"); //传统的写法 for(String ss:list){ System.out.println(ss); } } 这是一段很是简单的集合遍历操做,集合中的字符串都进行输出操做 |
Java jdk8 以前的代码:
public class Test1{ public static void main(String[] args) { ArrayList<String>list=new ArrayList<>(); list.add("李文杰"); list.add("李文集"); list.add("李文洁"); list.add("王智雅"); list.add("何舒雅"); list.add("王文文"); ArrayList<String>li=new ArrayList<>(); //传统的写法 for(String ss:list){ if(ss.startsWith("李")){ li.add(ss); } } for(String ss2: li){ System.out.println(ss2); } } } |
分析这段代码中两个 for 循环:
一、 首先筛选全部姓李的人
二、 而后存入到新的集合中
三、 最后进行筛选结果的输出
每当咱们须要对集合中的元素进行操做的时候,老是须要进行循环,循环,再循环。循环只 是作事的方式而不是目的,另外一方面,使用线性循环就意味着只能遍历一次,若是但愿再次
遍历,只能在执行一次代码。
Stream流的优雅写法
//体验Stream 流 public class Test1{ public static void main(String[] args) { ArrayList<String>list=new ArrayList<>(); list.add("李文杰"); list.add("李文集"); list.add("李文洁"); list.add("王智雅"); list.add("何舒雅"); list.add("王文文"); //使用Stream 流输出 list.stream().filter(s->s.startsWith("李")). filter(s->s.length()==3).forEach(s->System.out.println(s)); //foreach 表明的就是for循环 } } 总结为: 获取流,过滤流,过滤流,开头为李,长度为 3,逐一输出,代码中并无体现使用线性循环或其余任何算法进行遍历。 |
//Collection 集合获取Stream流 public class Test2 { public static void main(String[] args) { //List集合获取流 List<String>list=new ArrayList<>(); Stream<String>listStream=list.stream();
//Set集合获取流 Set<String>set=new HashSet<>(); Stream<String>setStream=set.stream();
//数组获取流Stream String[]array={"13","34","65","76","23"}; Stream<String>stream=Stream.of(array); } } |
//Map集合获取流Stream流 public class Test2 { public static void main(String[] args) { //Map集合获取流 Map<String,String>map=new HashMap<>(); //Map集合Stream流获取键 Stream<String>mapStream=map.keySet().stream(); //Map集合Stream流获取值 Stream<String>maps=map.values().stream(); //Map集合经过EntrySet来获取Stream流,获得键和值 Stream<Map.Entry<String,String>>entry=map.entrySet().stream(); } } |
外,其他方法都是延迟方法)
void forEach(Consumer<? super T> action) d |
该方法接收一个Consumer接口的函数,会将每个流元素交给函数进行处理
基本使用:
public class Test3 { public static void main(String[] args) { //foreach示例 Stream<String>stream=Stream.of("李文杰","张文集","王兰君","李军帽"); stream.forEach(s -> System.out.println(s)); } } |
过滤:能够经过Filter方法将一个流转换为另外一个流
Stream<T> filter(Predicate<? super T> predicate) |
该方法接收一个 Predicate 函数式接口参数
基本使用:
public class Test3 { public static void main(String[] args) { //Fifter过滤器 Stream<String>stream=Stream.of("李文杰","张文集","王兰君","李军帽"); Stream<String>newstream=stream.filter(s ->s.startsWith("李")); newstream.forEach(s -> System.out.println(s)); } } |
1 若是须要将流中的元素映射到另外一个流中,可使用 map 方法.
<R> Stream<R> flatMap(Function<? super T,? extends Stream<? extends R>> mapper) |
基本使用:
public class Test3 { public static void main(String[] args) { //map映射 Stream<String>stream1=Stream.of("12","34","45","66","99"); Stream<Integer>stream2=stream1.map(s ->Integer.parseInt(s)); stream2.forEach(s-> System.out.println(s+10)); } } |
流经过count方法来计算流中的个数
long count(); 返回此流中的元素数。 |
基本使用
//count方法的使用。 public class Test3 { public static void main(String[] args) { //count方法来统计流的个数 Stream<String>stream3=Stream.of("刘备","张飞","卧龙","凤雏"); System.out.println("统计流的个数:"+stream3.count()); } } |
Limit 方法能够对流进行截取,只取前n个。
Stream<T> limit(long maxSize) |
基本使用:
public class Test3 { public static void main(String[] args) { //limit方法使用,对流进行截取 Stream<String>stream4=Stream.of("赵云","关羽","黄忠","马超"); Stream<String>stream5=stream4.limit(3); stream5.forEach(s -> System.out.println(s)); } } |
Skip方法能够对流实现跳过的操做,继续执行如下的数据
Stream<T> skip (long n) ; 若是流的当前长度大于 n,则跳过前 n 个,不然将会获得一个长度为 0 的空流 |
基本使用:
public class Test3 { public static void main(String[] args) { //Skip方法实现对流元素的跳过 Stream<String>stream5=Stream.of("赵云","关羽","黄忠","马超"); Stream<String>stream6=stream5.skip(2); stream6.forEach(s -> System.out.println(s)); } } |
若是有两个流,但愿合并成为一个流,那么可使用 Stream 接口静态方法 concat
static <T> Stream<T> concat(Stream<? extends T> a, Stream<? extends T> b) |
基本使用:
public class Test3 { public static void main(String[] args) { //concat 若是两个流,但愿合并为一个流,那么就能够进行组合 Stream<String>stream7=Stream.of("马超"); Stream<String>stream8=Stream.of("西凉人"); Stream<String>stream9=Stream.concat(stream7,stream8); stream9.forEach(s -> System.out.println(s));} } |