• Java对List的操作


     List转成map,并自定义key

    假设有一List中有如下数据

    1. Person{id='100', name='张三0100'}
    2. Person{id='101', name='张三1100'}
    3. Person{id='102', name='张三2100'}
    4. Person{id='103', name='张三3100'}
    5. Person{id='104', name='张三4100'}
    6. Person{id='105', name='张三5100'}
    7. Person{id='106', name='张三6100'}
    8. Person{id='107', name='张三7100'}
    9. Person{id='108', name='张三8100'}
    10. Person{id='109', name='张三9100'}
    1. foreach 依旧简单而直观
      1. Map map = new HashMap<>();
      2. people.forEach(item->{
      3. String key=item.getId()+"-"+item.getName();
      4. map.put(key,item);
      5. });
    2. Stream
      1. Map stresmMap = people.stream()
      2. .collect(Collectors.toMap(
      3. item -> item.getId() + "-" + item.getName(),
      4. item -> item
      5. ));

    打印结果如下: 

    1. stresmMap.forEach((k, person) ->{
    2. System.out.print(k + " : ");
    3. System.out.println(person);
    4. });
    5. -------------------------------------------------
    6. 106-张三6100 : Person{id='106', name='张三6100'}
    7. 107-张三7100 : Person{id='107', name='张三7100'}
    8. 105-张三5100 : Person{id='105', name='张三5100'}
    9. 103-张三3100 : Person{id='103', name='张三3100'}
    10. 102-张三2100 : Person{id='102', name='张三2100'}
    11. 101-张三1100 : Person{id='101', name='张三1100'}
    12. 100-张三0100 : Person{id='100', name='张三0100'}
    13. 108-张三8100 : Person{id='108', name='张三8100'}
    14. 104-张三4100 : Person{id='104', name='张三4100'}
    15. 109-张三9100 : Person{id='109', name='张三9100'}

    数据筛选

    假设有如下数据,从List 中,快速取出每个对象的name,组成一个新的list

    1. let PersonList = [
    2. {id:1,name:"张三"},
    3. {id:2,name:"李思思"},
    4. {id:3,name:"网无无"}
    5. ]

     首先你会想到什么?是`foreach`吗 ?

    1. let nameList= []
    2. Person.forEach(item=>{
    3. nameList.push(item.name)
    4. })
    5. console.log(nameList);
    6. -----------------------------------------
    7. [Running] node "e:\我的文件\testCode\test-java-vue\JavaScript\basic.js"
    8. [ '张三', '李思思', '网无无' ]

    有没有更简单的方法呢?

    1. let nameList = PersonList.map(item => item.name);
    2. console.log(nameList);
    3. --------------------------------------------
    4. [Running] node "e:\我的文件\testCode\test-java-vue\JavaScript\basic.js"
    5. [ '张三', '李思思', '网无无' ]

    数据筛选Stream()初使用

    1. public List filterByExamDate(List seriousManageList, int examDateDelta) {
    2. LocalDate today = LocalDate.now();
    3. return seriousManageList.stream()
    4. .filter(seriousManage -> {
    5. LocalDate examDate = seriousManage.getExamDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
    6. long daysBetween = ChronoUnit.DAYS.between(today, examDate);
    7. return daysBetween % examDateDelta == 0;
    8. })
    9. .collect(Collectors.toList());
    10. }

    tips:ChronoUnit.DAYS.between(today, examDate) 是用于计算两个日期之间相差的天数的方法。在这里,today 是表示今天日期的 LocalDate 对象,而 examDate 是表示某条数据的考试日期的 LocalDate 对象。 

    在 Java 中,Stream 的 filter 操作用于从一个 Stream 中筛选出满足指定条件的元素,然后返回一个新的 Stream。在处理 List 的时候,您可以使用 stream() 方法将 List 转换为一个 Stream,然后使用 filter 方法对其中的元素进行筛选。

    以下是如何在 Java 中使用 Stream 的 filter 操作来处理 List 的简单示例:

    1. List filteredPeople = people.stream()
    2. .filter(person -> person.getAge() >= 25)
    3. .collect(Collectors.toList());

    在这个示例中,.filter(person -> person.getAge() >= 25) 部分就是使用 filter 操作来筛选满足条件的 Person 对象。最终,通过 .collect(Collectors.toList()) 将筛选后的结果收集回一个新的 List

    将两个List合并为一个

    1. addAll 方法

    1. List list1 = new ArrayList<>();
    2. List list2 = new ArrayList<>();
    3. // 合并两个列表
    4. list1.addAll(list2);

    上述代码会将 list2 中的所有元素添加到 list1 中,从而实现两个列表的合并。

    2. Streamconcat 操作

    如果您更喜欢使用 Stream API,可以使用 Stream.concat 操作来合并两个流:

    1. List mergedList = Stream.concat(list1.stream(), list2.stream())
    2. .collect(Collectors.toList());

    效率比较 

    让我们来比较一下使用 addAll 方法和使用 Streamconcat 操作的效率。

    1. addAll 方法addAll 方法是一个原地操作,它会修改一个列表,并将另一个列表的元素添加到该列表中。这种方法可以很快地将一个列表的元素添加到另一个列表,因为它只涉及一个列表的操作。
      1. long startTime = System.nanoTime();
      2. list1.addAll(list2);
      3. long endTime = System.nanoTime();
      4. long duration = endTime - startTime;
      5. System.out.println("addAll time: " + duration + " nanoseconds");
    2. Stream 的 concat 操作
      Streamconcat 操作会返回一个新的流,其中包含两个原始流的元素。这涉及创建一个新的流对象以容纳所有元素,并遍历两个原始流的元素来填充新的流。
      1. long startTime = System.nanoTime();
      2. List mergedList = Stream.concat(list1.stream(), list2.stream())
      3. .collect(Collectors.toList());
      4. long endTime = System.nanoTime();
      5. long duration = endTime - startTime;
      6. System.out.println("Stream.concat time: " + duration + " nanoseconds");

      在合并大型列表时,addAll 方法通常会更快,因为它直接修改一个列表而无需创建新的流对象。

    返回一个空列表

    在有些必要的时候,我们需要返回一个空列表,可以怎么做呢?

    1. List emptyList = new ArrayList<>();
    2. // 现在 emptyList 是一个空列表
    3. List emptyList = Collections.emptyList();
    4. // 现在 emptyList 是一个空列表
    5. List emptyList = Arrays.asList();
    6. // 现在 emptyList 是一个空列表
    7. return Collections.emptyList();

    List转String,元素中间用,分割

    将一个 List 转换为一个逗号分隔的字符串可以使用 String.join() 方法。这个方法可以将列表中的元素连接起来,使用指定的分隔符。

    1. import java.util.ArrayList;
    2. import java.util.List;
    3. public class ListToStringExample {
    4. public static void main(String[] args) {
    5. List stringList = new ArrayList<>();
    6. stringList.add("apple");
    7. stringList.add("banana");
    8. stringList.add("orange");
    9. String result = String.join(",", stringList);
    10. System.out.println(result);
    11. }
    12. }
    13. 打印--------------------------------
    14. apple,banana,orange

     如果我们面对的不是String,而是`Long` 亦或其他类型的对象,又该当如何?

    当然是先把它变成String了

    1. List childTenantIds = this.tenantApi.getALLTenantIdsForChild(tenantId).getData();
    2. String childTenantIdsString = String.join(",", childTenantIds.stream().map(String::valueOf).collect(Collectors.toList()));

    以上只是我个人日常使用到的一些方法,欢迎各位道友补充。

  • 相关阅读:
    Service Worker Cache 和 HTTP Cache 联合使用的场景讨论
    Yearning-SQL审核平台
    【GCC】关于 -finput-charset= 和 -fexec-charset= 选项
    小程序使用this.animate实现3维动画切换
    【算法与数据结构】--目录
    多线程JUC 第2季 ReentranctLock实现加锁和解锁过程
    解决dev GridControl 刷新数据后,滚动条恢复原来位置
    windows平台编译CEF支持H264(MP3、MP4)超详细
    如何实现FinClip微信授权登录的三种方案
    一场环球AI大赛,献给青春的最好礼物
  • 原文地址:https://blog.csdn.net/m0_48660016/article/details/134520774