• 十二、集合操作


    1. FluentIterable

    FluentIterable 流迭代器早于JDK8的stream产生,提了了一些集合类的过滤、转换等相关操作。在JDK8之前使用比较多,JDK8之后推荐使用JDK的stream相关操作。FluentIterable的相关操作可以作为了解。

    1. package org.example.model.guava;
    2. import com.google.common.base.Optional;
    3. import com.google.common.collect.FluentIterable;
    4. import com.google.common.collect.ImmutableList;
    5. import org.assertj.core.util.Lists;
    6. import org.junit.Test;
    7. import java.util.ArrayList;
    8. import static org.assertj.core.api.Assertions.assertThat;
    9. public class FluentIterableTest {
    10. @Test
    11. public void test1() {
    12. ArrayList strings = Lists.newArrayList("A", "B", "C", "DDD");
    13. FluentIterable fit = FluentIterable.from(strings);
    14. assertThat(fit.size()).isEqualTo(4); // size操作不建议使用,可以需要遍历计算长度
    15. // filter
    16. FluentIterable filter = fit.filter(e -> e != null && e.length() > 2);
    17. assertThat(filter.size()).isEqualTo(1);
    18. assertThat(strings).size().isEqualTo(4); // filter操作不会影响原始列表
    19. assertThat(fit.size()).isEqualTo(4); // filter为新对象,不影响旧的fit
    20. assertThat(fit.contains("A")).isTrue();
    21. // 使用append添加元素,产生新的FluentIterable
    22. FluentIterable append = fit.append("E");
    23. assertThat(append.size()).isEqualTo(5);
    24. assertThat(append.contains("E")).isTrue();
    25. assertThat(fit.size()).isEqualTo(4); // 不影响旧的fit
    26. assertThat(strings).size().isEqualTo(4); // 不影响原始list
    27. }
    28. @Test
    29. public void test2() {
    30. ArrayList strings = Lists.newArrayList("A", "B", "C", "DDD");
    31. FluentIterable fit = FluentIterable.from(strings);
    32. assertThat(fit.size()).isEqualTo(4); // size操作不建议使用,可以需要遍历计算长度
    33. assertThat(fit.allMatch(e -> e.equals("A"))).isFalse();
    34. assertThat(fit.allMatch(e -> e.equals("B"))).isFalse();
    35. Optional firstMatch = fit.firstMatch(e -> e.equals("B"));
    36. assertThat(firstMatch.isPresent()).isTrue(); // 注意这里guava的Optional
    37. Optional first = fit.first();
    38. assertThat(first.isPresent()).isTrue(); // 注意这里guava的Optional
    39. Optional last = fit.last();
    40. assertThat(last.isPresent()).isTrue(); // 注意这里guava的Optional
    41. FluentIterable limit = fit.limit(3);
    42. assertThat(fit.size()).isEqualTo(4); // limit会创建新的FluentIterable
    43. limit.forEach(System.out::print); // ABC
    44. // toList,toMap转换为list和map
    45. ImmutableList list = fit.toList();
    46. ArrayList list2 = Lists.newArrayList("F");
    47. fit.copyInto(list2); // 将数据拷贝到list2
    48. System.out.println(list2); // [F, A, B, C, DDD]
    49. // 转换
    50. System.out.println(fit.transform(String::length).toList()); // [1, 1, 1, 3]
    51. }
    52. }

    2. Lists

    1. import com.google.common.collect.Lists;
    2. import org.junit.Test;
    3. import java.util.ArrayList;
    4. import java.util.LinkedList;
    5. import java.util.List;
    6. import java.util.concurrent.CopyOnWriteArrayList;
    7. /**
    8. * 功能描述
    9. *
    10. * @author q00811349
    11. * @since 2023-09-12
    12. */
    13. public class ListsTest {
    14. @Test
    15. public void test1() {
    16. // 笛卡尔乘积
    17. List> lists = Lists.cartesianProduct(Lists.newArrayList("1", "2"), Lists.newArrayList("A", "B"));
    18. System.out.println(lists); // [[1, A], [1, B], [2, A], [2, B]]
    19. // 转换
    20. ArrayList strings = Lists.newArrayList("A", "B", "C");
    21. List transform = Lists.transform(strings, String::toLowerCase); // 入参不能为空
    22. System.out.println(transform); // [a, b, c]
    23. // 反转
    24. System.out.println(Lists.reverse(strings)); // [C, B, A]
    25. // 拆分遍历
    26. System.out.println(Lists.partition(strings, 2)); // [[A, B], [C]]
    27. // 创建一个LinkedList, 支持创建空的和使用迭代器创建,不支持使用给定元素创建
    28. LinkedList linkedList = Lists.newLinkedList(strings);
    29. System.out.println(linkedList); // [A, B, C]
    30. // 创建copyOnWriteArrayList, 高并发读多写少场景使用
    31. CopyOnWriteArrayList copyOnWriteArrayList = Lists.newCopyOnWriteArrayList(linkedList);
    32. System.out.println(copyOnWriteArrayList); // [A, B, C]
    33. }
    34. }

  • 相关阅读:
    三、开发工具
    linux下.bashrc文件修改和生效
    统计数(C++)
    torch.eq的广播机制兼谈快速生成对角掩码
    Flowable 外置的 HTML 表单怎么玩?
    slf4j中如何进行log4j配置呢?
    【C++11】C++的新特性(详解)
    CSV文件打开乱码解决方案
    人工智能框架实战精讲:Keras项目-英文语料的文本分类实战与调参优化
    如何把 ThinkPHP 5 的项目迁移到阿里云函数计算来应对流量洪峰?
  • 原文地址:https://blog.csdn.net/weixin_43476824/article/details/132787614