利用Java流进行类的整型字段求和的例子

简介: 利用Java流进行类的整型字段求和的例子

我有两个测试类:

import java.util.Arrays;
import java.util.List;
import java.util.function.ToIntFunction;
import java.util.stream.IntStream;
import java.util.stream.Stream;
class Age{
  private int age;
  public Age(int age){
    this.age = age;
  }
  public int getAgeValue(){
    return this.age;
  }
}
@SuppressWarnings("unused")
class User{
  private int id;
  private String name;
  private Age age;
  public User(int id, String name, int age){
    this.id = id;
    this.name = name;
    this.age = new Age(age);
  }
  public Age getAge(){
    return this.age;
  }
  public int getAgeWrapper(){
    return this.age.getAgeValue();
  }
}

先构造一个集合Collections:

private static List<User> users = Arrays.asList( 
            new User(1, "张三", 1),  
            new User(2, "李四", 2),  
            new User(3,"王五", 3),  
            new User(4, "赵六", 4));

// 获得一个并行流:


Stream userStream = users.parallelStream();


// 获得一个映射函数,该函数配合stream使用,能把所有User实例的Age字段映射成IntStream


ToIntFunction mapper = User::getAgeWrapper;


IntStream intstream = userStream.mapToInt(mapper);


// 得到输出:10


System.out.println("Total: " + intstream.sum());


如果重复调用sum:


System.out.println("Total2: " + intstream.sum());


会遇到错误消息:


Exception in thread “main” java.lang.IllegalStateException: stream has already been operated upon or closed

at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:229)

at java.base/java.util.stream.IntPipeline.reduce(IntPipeline.java:491)

at java.base/java.util.stream.IntPipeline.sum(IntPipeline.java:449)

at java8.stream.SumTest.main(SumTest.java:68)


如果不想用stream自带的sum方法,也可以手动用reduce计算:


int total = intstream.reduce(0, (x, y) -> x + y);


一样能得到10的结果。


全部测试代码:

package java8.stream;
import java.util.Arrays;
import java.util.List;
import java.util.function.ToIntFunction;
import java.util.stream.IntStream;
import java.util.stream.Stream;
class Age{
  private int age;
  public Age(int age){
    this.age = age;
  }
  public int getAgeValue(){
    return this.age;
  }
}
@SuppressWarnings("unused")
class User{
  private int id;
  private String name;
  private Age age;
  public User(int id, String name, int age){
    this.id = id;
    this.name = name;
    this.age = new Age(age);
  }
  public Age getAge(){
    return this.age;
  }
  public int getAgeWrapper(){
    return this.age.getAgeValue();
  }
}
public class SumTest {
  private static List<User> users = Arrays.asList( 
            new User(1, "张三", 1),  
            new User(2, "李四", 2),  
            new User(3,"王五", 3),  
            new User(4, "赵六", 4));
  public static String covert2SnakeCase(final String camelCase)
  {
    final String regex = "([a-z])([A-Z])";
    final String replacement = "$1_$2";
    return camelCase.replaceAll(regex, replacement).toLowerCase();
  }
  public static void main(String[] args) {
    //double sum = users.parallelStream().mapToInt(User::getAge).getAgeValue().reduce(0, (x, y) -> x + y); 
    double sum2 = users.parallelStream().mapToInt(User::getAgeWrapper).sum(); 
    double sum = 0;
    Stream<User> userStream = users.parallelStream();
    ToIntFunction<User> mapper = User::getAgeWrapper;
    IntStream intstream = userStream.mapToInt(mapper);
    int total = intstream.reduce(0, (x, y) -> x + y);
    System.out.println("sum: " + total);
    // System.out.println("Total: " + intstream.sum());
    //System.out.println("Total2: " + intstream.sum());
    System.out.println("sum1: " + sum);
    //System.out.println(" sum2: " + sum2);
    System.out.println(covert2SnakeCase("helloJerry"));
    System.out.println(covert2SnakeCase("CongratulationsJerry"));
  }
}
相关文章
|
1天前
|
Java
【JAVA基础篇教学】第五篇:Java面向对象编程:类、对象、继承、多态
【JAVA基础篇教学】第五篇:Java面向对象编程:类、对象、继承、多态
|
1天前
|
存储 安全 Java
Java容器类List、ArrayList、Vector及map、HashTable、HashMap
Java容器类List、ArrayList、Vector及map、HashTable、HashMap
|
2天前
|
Java 编译器 开发者
Java一分钟之-继承:复用与扩展类的特性
【5月更文挑战第9天】本文探讨了Java中的继承机制,通过实例展示了如何使用`extends`创建子类继承父类的属性和方法。文章列举了常见问题和易错点,如构造器调用、方法覆盖、访问权限和类型转换,并提供了解决方案。建议深入理解继承原理,谨慎设计类结构,利用抽象类和接口以提高代码复用和扩展性。正确应用继承能构建更清晰、灵活的代码结构,提升面向对象设计能力。
9 0
|
2天前
|
Java
【Java多线程】面试常考 —— JUC(java.util.concurrent) 的常见类
【Java多线程】面试常考 —— JUC(java.util.concurrent) 的常见类
11 0
|
2天前
|
Java API 调度
【Java多线程】Thread类的基本用法
【Java多线程】Thread类的基本用法
5 0
|
2天前
|
SQL Java 数据库连接
JDBC Java标准库提供的一些api(类+方法) 统一各种数据库提供的api
JDBC Java标准库提供的一些api(类+方法) 统一各种数据库提供的api
9 0
|
3天前
|
Java
Java一分钟之-类与对象:面向对象编程入门
【5月更文挑战第8天】本文为Java面向对象编程的入门指南,介绍了类与对象的基础概念、常见问题及规避策略。文章通过代码示例展示了如何定义类,包括访问修饰符的适当使用、构造器的设计以及方法的封装。同时,讨论了对象创建与使用时可能遇到的内存泄漏、空指针异常和数据不一致等问题,并提供了相应的解决建议。学习OOP需注重理论与实践相结合,不断编写和优化代码。
26 1
|
4天前
|
Java 开发者
在Java中,接口和超类在多态性中扮演着重要的角色
Java中的接口和超类支持多态性,接口作为规范,允许多继承和回调机制;超类提供基类,实现代码重用和方法重写,两者共同促进代码的灵活性和可维护性。
25 10
|
4天前
|
Java
Java并发Futures和Callables类
Java程序`TestThread`演示了如何在多线程环境中使用`Futures`和`Callables`。它创建了一个单线程`ExecutorService`,然后提交两个`FactorialService`任务,分别计算10和20的阶乘。每个任务返回一个`Future`对象,通过`get`方法获取结果,该方法会阻塞直到计算完成。计算过程中模拟延迟以展示异步执行。最终,打印出10!和20!的结果。
|
9天前
|
网络协议 Java
Java中如何使用Socket类检测端口是否存在
Java中如何使用Socket类检测端口是否存在
24 4