Java函数式编程——Steam


正文:

前言

随着社会的不断发展,Java这门技术也越来越重要,很多人都开启了学习Java编程,本文就介绍了Java中Steam流程的一些内容。

一、Steam是什么?

Stream是 Java 8新增加的类,用来补充集合类。
Stream代表数据流,流中的数据元素的数量可能是有限的,也可能是无限的。
Java Stream提供了提供了串行和并行两种类型的流,保持一致的接口,提供函数式编程方式,以管道方式提供中间操作和最终执行操作,为Java语言的集合提供了现代语言提供的类似的高阶函数操作,简化和提高了Java集合的功能。

二、介绍

Stream 代表了来自某个源的对象的序列,这些序列支持聚集操作。下面是 Stream 的一些特性:

元素序列:Stream 以序列的形式提供了特定类型的元素的集合。根据需求,它可以获得和计算元素,但不会储存任何元素。
源:Stream 可以将集合、数组和 I/O 资源作为输入源。
聚集操作:Stream 支持诸如filter、map、limit、reduce等的聚集操作。
流水技术:许多 Stream 操作返回了流本身,故它们的返回值可以以流水的形式存在。这些操作称之为中间操作,并且它们的功能就是负责输入、处理和向目标输出。collect()方法是一个终结操作,通常存在于流水线操作的末端,来标记流的结束。
自动迭代:Stream 的操作可以基于已提供的源元素进行内部的迭代,而集合则需要显式的迭代。

相关方法

集合的接口有两个方法来产生流:

  • stream():该方法返回一个将集合视为源的连续流。
  • parallelStream():该方法返回一个将集合视为源的并行流。

常用方法:

forEach:该方法用于对 Stream 中的每个元素进行迭代操作。
map:该方法用于将每个元素映射到对应的结果上。
filter:该方法用于过滤满足条件的元素。
limit:该方法用于减少 Stream 的大小。
sorted:该方法用于对 Stream 排序。

3.1 使用Collection下的 stream() 和 parallelStream() 方法

代码如下(示例):

List<String> list = new ArrayList<>();
Stream<String> stream = list.stream(); //获取一个顺序流
Stream<String> parallelStream = list.parallelStream(); //获取一个并行流

3.2 使用Arrays 中的 stream() 方法,将数组转成流

Integer[] nums = new Integer[10];
Stream<Integer> stream = Arrays.stream(nums);

四、流的中间操作

筛选与切片

filter:过滤流中的某些元素
limit skip distinct sorted 都是有状态操作,这些操作只有拿到前面处理后的所有元素之后才能继续下去。
limit(n):获取前n个元素
skip(n):跳过前n元素,配合limit(n)可实现分页
distinct:通过流中元素的 hashCode() 和 equals() 去除重复元素

部分代码示例:

Stream<Integer> stream = Stream.of(6, 4, 6, 7, 3, 9, 8, 10, 12, 14, 14);
 
Stream<Integer> newStream = stream.filter(s -> s > 5) //6 6 7 9 8 10 12 14 14
        .distinct() //6 7 9 8 10 12 14
        .skip(2) //9 8 10 12 14
        .limit(2); //9 8
newStream.forEach(System.out::println);

五、映射

map:接收一个函数作为参数,该函数会被应用到每个元素上,并将其映射成一个新的元素。
flatMap:接收一个函数作为参数,将流中的每个值都换成另一个流,然后把所有流连接成一个流。

   List<String> list = Arrays.asList("a,b,c", "1,2,3");
//      去掉字符串中所有的,
        List<String> collect = list.stream().map(s -> s.replaceAll(",", "")).collect(Collectors.toList());
        System.out.println(collect);

//        flatMap 接收一个函数作为参数,将流中的每个值都换成另一个流,然后把所有流连接成一个流。

        Stream<String> stringStream = list.stream().flatMap(s -> {
//            将字符串以,分割后得到一个字符串数组
            String[] split = s.split(",");
//            然后将每个字符串数组对应流返回,flatMap会自动把返回的所有流连接成一个流
            Stream<String> stream = Arrays.stream(split);
            return stream;
        });
        System.out.println(stringStream.collect(Collectors.toList()));

六、排序

sorted():自然排序,流中元素需实现Comparable接口
sorted(Comparator com):定制排序,自定义Comparator排序器

自然排序
//   按照color的字符串大小进行排序
   @Override
  public int compareTo(Apple o) {
     return color.compareToIgnoreCase(o.color);
  }
自定义排序
   List<Apple> compare = appleList.stream().sorted((o1, o2) -> {
            if (!o1.getColor().equals(o2.getColor())) {
//                compareToIgnoreCase 忽略大小写排序,大于返回ascll的差值,正值,小于返回负值
                return o1.getColor().compareToIgnoreCase(o2.getColor());
            } else {
//                逆序排列
                return o1.getWeight() - o2.getWeight() ;
            }
        }).collect(Collectors.toList());
        System.out.println(compare);

七、流的终止操作

匹配和聚合

allmatch,noneMatch,anyMatch用于对集合中对象的某一个属性值进行判断,
allMatch全部符合该条件返回true,
noneMatch全部不符合该断言返回true
anyMatch 任意一个元素符合该断言返回true


List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
boolean allMatch = list.stream().allMatch(e -> e > 10); //false
boolean noneMatch = list.stream().noneMatch(e -> e > 10); //true
boolean anyMatch = list.stream().anyMatch(e -> e > 4);  //true

findFirst:返回流中第一个元素
findAny:返回流中的任意元素
count:返回流中元素的总个数
max:返回流中元素最大值
min:返回流中元素最小值

总结

本章学习了java的Steam流,如有解释不到位的地方多多谅解!欢迎各位大佬莅临指点。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 在Java中,可以使用Jackson库来处理JSON数据。使用Jackson库可以将JSON字符串转换为Java对象,也可以将Java对象转换为JSON字符串。 如果要使用Jackson的streaming API来处理JSON数据,需要先创建JsonFactory实例,然后使用该实例创建JsonParser或JsonGenerator。 例如,以下代码展示了如何使用JsonParser读取JSON数据: ``` JsonFactory jsonFactory = new JsonFactory(); JsonParser jsonParser = jsonFactory.createParser(jsonString); while (jsonParser.nextToken() != null) { // do something with the token } jsonParser.close(); ``` 另外,配合Gson等库使用效果更佳. ### 回答2: 在Java中使用JSON时,可以使用流(Stream)来处理JSON数据。 首先,在Java中,可以使用第三方库(如Jackson、Gson等)来处理JSON数据。这些库提供了一系列的API和工具,可以方便地将JSON数据转换为Java对象及Java对象转换为JSON数据。 使用流(Stream)的方式可以更加高效地处理JSON数据。可以使用字节流(InputStream/OutputStream)或字符流(Reader/Writer)来读取和写入JSON数据。 对于读取JSON数据,可以使用InputStream或Reader来读取JSON数据源(如文件、网络请求等),然后通过JSON库提供的API将其解析成Java对象。例如,可以使用JsonParser类来解析JSON数据,并将其转换为Java对象。 对于写入JSON数据,可以使用OutputStream或Writer来将Java对象转换为JSON数据,并将其写入到指定目标(如文件、网络请求等)。例如,可以使用JsonGenerator类来生成JSON数据,并使用OutputStream或Writer将其写入到指定的位置。 在处理JSON数据时,还可以使用流的链式调用来进行一系列的操作,以便更灵活地处理数据。例如,可以通过流式操作将JSON数据源转换为Java对象,然后对其进行过滤、映射、排序等操作,最后将结果转换为JSON数据。 总之,使用流(Stream)的方式可以更高效、灵活地处理JSON数据。通过选择合适的JSON库和使用流式操作,可以更好地利用Java语言的特性来处理JSON数据。 ### 回答3: 在Java中,可以使用Jackson库来处理JSON数据流。Jackson是一个流行的处理JSON数据的Java库,提供了丰富的API和功能。 首先,需要引入Jackson库的依赖。可以使用Maven或Gradle等构建工具来添加以下依赖: ``` <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.12.2</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.12.2</version> </dependency> ``` 接下来,可以使用`JsonFactory`类和`JsonParser`类来创建和解析JSON数据流。以下是一个简单的示例代码: ```java import com.fasterxml.jackson.core.JsonFactory; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonToken; import java.io.IOException; public class JsonStreamExample { public static void main(String[] args) { String json = "{\"name\":\"John\",\"age\":30,\"city\":\"New York\"}"; JsonFactory factory = new JsonFactory(); try (JsonParser parser = factory.createParser(json)) { while (!parser.isClosed()) { JsonToken token = parser.nextToken(); if (JsonToken.FIELD_NAME.equals(token)) { String fieldName = parser.getCurrentName(); token = parser.nextToken(); String fieldValue = parser.getValueAsString(); System.out.println(fieldName + ": " + fieldValue); } } } catch (IOException e) { e.printStackTrace(); } } } ``` 在上面的示例中,我们创建了一个JSON数据流的解析器,并使用`JsonToken`来遍历JSON数据流中的字段名和字段值。可以根据需要使用不同的`JsonToken`来处理不同类型的JSON值。 除了解析JSON数据流外,Jackson还提供了一系列对象映射的功能,可以将JSON数据流转换成Java对象,或将Java对象转换成JSON数据流。可以使用`ObjectMapper`类实现这些功能。 总之,通过使用Jackson库中提供的API和功能,我们可以轻松地在Java中处理和操作JSON数据流。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值