spring 通过比较元素使用流对自定义对象列表进行分组[重复]

wmvff8tz  于 2023-04-19  发布在  Spring
关注(0)|答案(1)|浏览(128)

此问题已在此处有答案

Convert List of List into list in java(5个答案)
6天前关闭。
我有一个名为FileInfo的自定义对象列表,其中FileInfo对应于

public class FileInfo {
    private String filePath;
    private Long fileSize;
    private String status;
}
List<FileInfo>

我想这个列表被分解成多个子列表的FileInfo这样的总和fileSize的所有元素在一个子列表是不是一个特定的值和结果是一个数据结构一样

List<List<FileInfo>>

我已经用常规的for each循环实现了这个解决方案,但是这需要使用java streams/Collectors来完成。

6qqygrtg

6qqygrtg1#

您可能需要收集List<FileInfo>到map中,然后将其转换为List<List<FileInfo>>。这可以使用Collectors.collectingAndThen来实现,首先您可以应用Collectors.groupingBy,然后客户将map转换为List<List<FileInfo>>
在下面的分组示例中,文件大小被加上并除以FILE_GROUP_LIMIT,商用于分组。
希望能帮上忙。

import java.util.List;
import java.util.concurrent.atomic.AtomicLong;
import java.util.function.Function;
import java.util.stream.Collectors;

public class FileInfoProcessor {

  private static Double FILE_GROUP_LIMIT = 200D;

  public static void main(String[] args) throws Exception {
    FileInfoProcessor processor = new FileInfoProcessor();
    List<FileInfo> files = List.of(new FileInfo("A", 100l, "Active"),
        new FileInfo("B", 100l, "Active"),
        new FileInfo("C", 100l, "Active"),
        new FileInfo("D", 100l, "Active"));
    List<List<FileInfo>> finalList = processor.processFiles(files);
    System.out.println(finalList);
  }

  private List<List<FileInfo>> processFiles(List<FileInfo> files) {
    return files
        .stream()
        .collect(
            Collectors.collectingAndThen(
                Collectors.groupingBy(fileInfoFunction(), Collectors.toList()), // This will convert the List<FileInfo> to Map<String, List<FileInfo>>
                map -> map.entrySet().stream().map(entry -> entry.getValue()).collect(Collectors.toList()))); // This will convert Map<String, List<FileInfo>> to List<List<FileInfo>>
  }

  private Function<FileInfo, String> fileInfoFunction() {
    final AtomicLong fileSizeAccumulator = new AtomicLong(0l);
    return (FileInfo file) -> {
      return String.valueOf(Math.ceil((double)fileSizeAccumulator.addAndGet(file.fileSize) / FILE_GROUP_LIMIT)); // This will return the quotient by which the map can be created grouped.
    };
  }

  static class FileInfo {
    private String filePath;
    private Long fileSize;
    private String status;

    public FileInfo(final String filePath, final Long fileSize, final String status) {
      this.filePath = filePath;
      this.fileSize = fileSize;
      this.status = status;
    }

    public String getFilePath() {
      return filePath;
    }

    public void setFilePath(final String filePath) {
      this.filePath = filePath;
    }

    public Long getFileSize() {
      return fileSize;
    }

    public void setFileSize(final Long fileSize) {
      this.fileSize = fileSize;
    }

    public String getStatus() {
      return status;
    }

    public void setStatus(final String status) {
      this.status = status;
    }

    @Override
    public String toString() {
      return "FileInfo{" + "filePath='" + filePath + '\'' + ", fileSize=" + fileSize + ", status='"
          + status + '\'' + '}';
    }
  }

}

相关问题