前言:
笔者的实习使用.NET环境而之前在学校给培训的是Java,
所以目前经常在两种语言和平台中切换,
由于工作中使用C#,学到了很多C#的知识和框架,它们或多或少和Java中有的东西有相似性.
从中也有一些启发,故将之记录下来
背景:
C#的Linq最早发布于2007年的C#3.0
而Java的流操作到Java8标准才出现
两者的使用目的都是为了简化或提高对集合类型(广义的IEumnable对象)的操作,提高效率.
且都被实践证明是非常重要的.
理解和掌握他们的使用对自己的编程思想是一次大的提升
接下来是具体的使用
Java的流操作
Java的流操作主要操作集合类型(当然也可以是数组),方式分为并行操作和串行操作(并行操作涉及多线程进行)
这里举一个简单的例子
public class StreamTest {
//初始化一个简单的字符串集合
private static List<String> list;
static {
list = new ArrayList<>();
list.add("GTX1060");
list.add("GTX1070");
list.add("6800XT");
list.add("RTX3090");
list.add("RTX3060");
list.add("6500XT");
list.add("HD7850");
}
public static void main(String[] args) {
//利用简单的Filter过滤,以下两种方法都能够把N卡从集合中挑选出来
List<String> fuckNvidia = list.stream()
.filter(item->!item.endsWith("XT")&&!item.startsWith("HD")).toList();
List<String> fuckNvidia2 = list.stream()
.filter(item->item.startsWith("GTX")||item.startsWith("RTX")).toList();
fuckNvidia.forEach(item->System.out.println(item));
//结果
//GTX1060
//GTX1070
//RTX3090
//RTX3060
//map方法以便利处理集合中每一个元素,将其变成小写
//这里要理解什么是Function<T,R>,Predicate<T>,在Java中,它们是动态的接口
//在C#中它们是函数委托可以直接赋值匹配的方法,这里有一个区别就是C#的Function可以无限的塞参数,像Funaction<T,T,T,T,...,R>而Java不行,BiFunction也只能输入两个参数,并不是很自由
List<String> lower = list.stream().map((item)-> {
return item.toLowerCase();}).toList();
lower.forEach(item->System.out.println(item));
//结果:
//gtx1060
//gtx1070
//6800xt
//rtx3090
//rtx3060
//6500xt
//hd7850
}
}
再来个稍微复杂点的例子
public class StreamPlusTest