当前位置: 首页 > 知识库问答 >
问题:

编写一个通用方法,在java中使用stream打印出listoflist的元素

牟嘉
2023-03-14

我是Java泛型的新手。我有两个不同类型的列表,分别是Object和Integer,我想写一个泛型方法来获取列表,并打印出列表中包含的元素。例子

  List<Object> list1 = List.of(1, List.of(2, 3, 4, List.of(5)), List.of(6, 7));
    genericmethod(list1);
    System.out.println();
  
    List<Integer> list2 = List.of(1, 2, 3, 4, 5, 6, 7, 8);
    genericmethod(list2);
    System.out.println();
    both the method should print 1,2,3,4,5,6,7,8

    I tried with

     public static void genericmethod(List<?> list) { 
         list.stream().forEach(System.out::println);
     }

输出:1[2,3,4,5][6,7]

1 2 3 4 5 6 7 8

但我只想从两个列表中打印出1,2,3,4,5,6,7,8。

共有1个答案

公冶子琪
2023-03-14

在几十年的Java开发中,我从未发现过这种结构是正确的方法。我建议找到一种类型安全的方式来存储数据,也许使用简单的自定义类型。

您不能以类型安全的方式执行此操作,因为列表整数的共同祖先是对象。您必须动态测试类型并相应地采取行动:

static Stream<Object> expand(Collection<?> elements) {
  return elements.stream()
    .flatMap(e -> e instanceof Collection col ? col.stream() : Stream.of(e));
}

您的示例将使用这样的函数:

expand(list1).forEach(System.out::print);
System.out.println();
expand(list2).forEach(System.out::print);
System.out.println();

如果您知道输入的所有“叶”元素都是特定的类型,比如< code>Integer,那么您可以在运行时执行类型检查,并编写一个泛型方法:

static <T> Stream<T> expand(Class<? extends T> t, Collection<?> elements) {
  return elements.stream()
    .flatMap(e -> e instanceof Collection col ? col.stream() : Stream.of(t.cast(e)));
}

int total = expand(Integer.class, list1).mapToInt(Integer::intValue).sum();

也许列表可以嵌套到任何深度:

static <T> Stream<T> expand(Class<? extends T> t, Collection<?> elements) {
  return elements.stream()
    .flatMap(e -> e instanceof Collection col ? expand(t, col) : Stream.of(t.cast(e)));
}
 类似资料:
  • 问题内容: 我有以下两个列表 我想要做的是像这样打印这两个列表 使用经典方式很容易做到 有没有一种方法可以使用Stream API Java 8? 我能做的是只打印一个清单 问题答案: 最简单的方法是创建一个来生成索引,然后将每个索引映射到您要创建的索引。 另外,您可能对这个SO问题感兴趣,使用带有lambda的JDK8压缩流(java.util.stream.Streams.zip),因为这是您

  • 我想获取ArrayList的每个元素并使用它来创建一个字符串: 包含与ArrayList和、、中的元素一样多的单词 将为每个单词打印ArrayList中的int值 为了更清楚,我想打印一个字符串,如下所示: 不幸的是,我只从ArrayList中获取最后一个整数的值,但“元素”字数是正确的,所以我的实际结果字符串如下所示: ArrayList只有4个元素: 要生成此错误字符串,我使用以下代码: 那么

  • 现在我把所有结果都放在一行了。如何在这个Java流中创建逻辑8,将forEach循环中的每5个字放入换行符()。每六个字印一行。

  • 问题内容: 当我发现以下代码在没有警告和打印的情况下进行编译时,我感到非常惊讶: 我预期会有编译错误。 编译该代码是否有原因? 确保参数具有相同类型的正确方法是什么? 编辑: 关于有限类型参数呢?我能想到的最好的是: 不幸的是,java不允许循环约束。不编译。这是死胡同吗? 问题答案: 究其原因,这是编译因为Java会推断出参数的最具体的超传入,在这种情况下,后是盒装,以和为传递。 没有泛型: 即

  • 我试图用两种不同的方式做阶乘方法。第一个是迭代方法,它非常适合打印出来。我很难打印出递归方法,它是一个int方法而不是val。我将如何通过使用与迭代方式相同的输入来打印递归方法?非常感谢任何帮助。我正在尝试在我的main中调用每个方法。 Java代码:

  • 我想要一个编译或运行时错误。我得到了一个输出。它是“”。它在Java中的原因是什么?