博客说明java
文章所涉及的资料来自互联网整理和我的总结,意在于我的学习和经验汇总,若有什么地方侵权,请联系本人删除,谢谢!程序员
在Java 8中,得益于Lambda所带来的函数式编程,引入了一个全新的Stream概念,用于解决已有集合类库既有的弊端编程
传统集合在于使用循环遍历数组
Java 8的Lambda让咱们能够更加专一于作什么(What),而不是怎么作(How),这点此前已经结合内部类进行 了对比说明。如今,咱们仔细体会一下上例代码,能够发现:数据结构
for循环的语法就是“怎么作”函数式编程
for循环的循环体才是“作什么”函数
import java.util.ArrayList; import java.util.List; /** * @author tanglei * @date 2020/6/10 10:21 下午 */ public class NormalFilter { public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("张无忌"); list.add("周芷若"); list.add("赵敏"); list.add("张强"); list.add("张三丰"); List<String> zhangList = new ArrayList<>(); for(String name : list){ if(name.startsWith("张")){ zhangList.add(name); } } List<String> shortList = new ArrayList<>(); for(String name : zhangList){ if(name.length() == 3){ shortList.add(name); } } for (String name : shortList){ System.out.println(name); } } }
import java.util.ArrayList; import java.util.List; /** * @author tanglei * @date 2020/6/10 10:28 下午 */ public class StreamFilter { public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("张无忌"); list.add("周芷若"); list.add("赵敏"); list.add("张强"); list.add("张三丰"); list.stream() .filter(s -> s.startsWith("张")) .filter(s -> s.length() == 3) .forEach(System.out::println); } }
使用stream能够十分简单明了的体现代码的逻辑学习
“Stream流”实际上是一个集合元素的函数模型,它并非集合,也不是数据结构,其自己并不存储任何 元素(或其地址值code
public static void main(String[] args) { List<String> list = new ArrayList<>(); Stream<String> stream1 = list.stream(); Set<String> set = new HashSet<>(); Stream<String> stream2 = set.stream(); Vector<String> vector = new Vector<>(); }
public static void main(String[] args) { Map<String, String> map = new HashMap<>(); Stream<String> keyStream = map.keySet().stream(); Stream<String> valueStream = map.values().stream(); Stream<Map.Entry<String, String>> entryStream = map.entrySet().stream(); }
public static void main(String[] args) { String[] array = { "张无忌", "张翠山", "张三丰", "张一元" }; Stream<String> stream = Stream.of(array); }
会将每个流元素交给该函数进行处理orm
public static void main(String[] args) { Stream<String> stream = Stream.of("张无忌", "张三丰", "周芷若"); stream.forEach(name‐> System.out.println(name)); }
能够经过 filter 方法将一个流转换成另外一个子集流
public static void main(String[] args) { Stream<String> original = Stream.of("张无忌", "张三丰", "周芷若"); Stream<String> result = original.filter(s ‐> s.startsWith("张")); }
若是须要将流中的元素映射到另外一个流中
public static void main(String[] args) { Stream<String> original = Stream.of("10", "12", "18"); Stream<Integer> result = original.map(str‐>Integer.parseInt(str)); }
数一数其中的元素个数
public static void main(String[] args) { Stream<String> original = Stream.of("张无忌", "张三丰", "周芷若"); Stream<String> result = original.filter(s ‐> s.startsWith("张")); System.out.println(result.count()); // 2 }
能够对流进行截取,只取用前n个
public static void main(String[] args) { Stream<String> original = Stream.of("张无忌", "张三丰", "周芷若"); Stream<String> result = original.limit(2); System.out.println(result.count()); // 2 }
若是但愿跳过前几个元素
public static void main(String[] args) { Stream<String> original = Stream.of("张无忌", "张三丰", "周芷若"); Stream<String> result = original.skip(2); System.out.println(result.count()); // 1 }
若是有两个流,但愿合并成为一个流
public static void main(String[] args) { Stream<String> streamA = Stream.of("张无忌"); Stream<String> streamB = Stream.of("张翠山"); Stream<String> result = Stream.concat(streamA, streamB); }
感谢
黑马程序员
以及勤劳的本身
关注公众号: 归子莫,获取更多的资料,还有更长的学习计划