函数式编程,所有功能就是返回一个新的值,没有其他行为,尤其是不得修改外部变量的值。
简单demo如下
import java.util.ArrayList; import java.util.List; public class StreamDemo { public static void main(String[] args) { List<String> firstList = new ArrayList<>(); firstList.add("1"); //实现接口 TestOperation testOperation = (list) -> { list.add("2"); }; //调用接口的operation方法 testOperation.operation(firstList); //打印firstList firstList.forEach(System.out::println); } //定义一个接口 interface TestOperation { void operation(List<String> list); } }
stream()方法为集合创建串行流。
filter 方法用于通过设置的条件过滤出元素
public static void main(String[] args) { List<String> stringList = new ArrayList<>(Arrays.asList("abc", "", "def", "ghi", "jkl", "mno")); List<String> secondList = stringList.stream().filter(string -> { //过滤空字符串 if(string.isEmpty()){ return false; } return true; }).collect(Collectors.toList()); //更简便的语句 //List<String> secondList = stringList.stream().filter(string->!string.isEmpty()).collect(Collectors.toList()); //打印字符串 secondList.forEach(System.out::println); }
Stream 提供了新的方法 ‘forEach’ 来迭代流中的每个数据
public static void main(String[] args) { List<String> stringList = new ArrayList<>(Arrays.asList("abc", "", "def", "ghi", "jkl", "mno")); List<String> secondList = new ArrayList<>(stringList); //foreach secondList.forEach(str->{ if(!str.isEmpty()){ System.out.println("str "+str+" is not empty!"); }else { System.out.println("it has a empty string!"); } }); }
limit 方法用于获取指定数量的流
public static void main(String[] args) { List<String> stringList = new ArrayList<>(Arrays.asList("abc", "", "def", "ghi", "jkl", "mno")); List<String> secondList = stringList.stream().filter(string->!string.isEmpty()).limit(2).collect(Collectors.toList()); secondList.forEach(System.out::println); }
map 方法用于映射每个元素到对应的结果
public static void main(String[] args) { List<String> stringList = new ArrayList<>(Arrays.asList("abc", "", "def", "ghi", "jkl", "mno")); List<String> secondList = stringList.stream().filter(string->!string.isEmpty()).map(str->{ //该处map的作用就是处理原来的字符串, //然后返回处理结果替换原来的字符串, //这里只是模拟在原来字符串后加了"," return str+","; }).collect(Collectors.toList()); secondList.forEach(System.out::println); }
public static void main(String[] args) { List<Integer> numberList = Arrays.asList(1, 2, 2, 3, 4, 5, 6, 7); // 获取对应的平方数,且采用distinct()方法过滤相同的平方数 List<Integer> squaresList = numberList.stream().map( i -> i*i).distinct().collect(Collectors.toList()); squaresList.forEach(System.out::println); }
第二种方式,采用Collectors.toMap可以生成map返回,此处需要注意的是,如果list中有相同的值,需要加distinct()去除相同的值,因为如果采用map的话,像如下例子中,“abc"有两个,所以会报错"Duplicate key abc”,此处根据需要决定是否使用该方法生成map。
public static void main(String[] args) { List<String> stringList = new ArrayList<>(Arrays.asList("abc", "abc", "def", "ghi", "jkl", "mno")); Map<String, String> strMap; //list转map strMap = stringList.stream().filter(str->!str.isEmpty()).distinct().collect(Collectors.toMap(str->str, str->str)); //遍历打印map strMap.forEach((key,value)->{ System.out.println(key+"::"+value); }); }
过滤相同的元素
public static void main(String[] args) { List<String> stringList = new ArrayList<>(Arrays.asList("abc", "abc", "def", "ghi", "jkl", "mno")); List<String> secondList = stringList.stream().filter(string->!string.isEmpty()).distinct().collect(Collectors.toList()); secondList.forEach(System.out::println); }
sorted 方法用于对元素进行排序,默认是升序排列
public static void main(String[] args) { List<Integer> numberList = Arrays.asList(8, 5, 2, 3, 4, 7, 6, 1); List<Integer> secondNumList = numberList.stream().sorted().collect(Collectors.toList()); secondNumList.forEach(System.out::println); }
修改成降序排列
public static void main(String[] args) { List<Integer> numberList = Arrays.asList(8, 5, 2, 3, 4, 7, 6, 1); List<Integer> secondNumList = numberList.stream().sorted((x,y)->y-x).collect(Collectors.toList()); secondNumList.forEach(System.out::println); }
Collectors 提供了一系列的操作,常用的有两个,一个是Collectors.toList(),将流转换成List,第二个是Collectors.joining(",")可以将流通过响应字符分割拼接成一个字符串
public static void main(String[] args) { List<String> stringList = new ArrayList<>(Arrays.asList("abc", "abc", "def", "ghi", "jkl", "mno")); String secondStr = stringList.stream().filter(string->!string.isEmpty()).distinct().collect(Collectors.joining(",")); System.out.println(secondStr); }
public class Goods { private int id; private int price; private String description; public int getId() { return id; } public void setId(int id) { this.id = id; } public int getPrice() { return price; } public void setPrice(int price) { this.price = price; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } }
public class ConsumerDemo { public static void main(String[] args) { Consumer<Goods> goodsConsumer = (goods -> { //对goods对象进行响应的业务处理 goods.setDescription("test"); }); //在需要进行特殊处理的地方,传递goodsConsume作为参数即可 //一般在公共方法中规定好一般的业务处理逻辑,然后传递Consumer //参数进去,在公共方法中判断其是否为空,不为空,则调用其accept方法进行特殊处理 Goods goods = new Goods(); goodsConsumer.accept(goods); System.out.println(goods.getDescription()); } }