繁体   English   中英

使用 Stream 将列表中的元素移动到第一个 position

[英]Move an element in the list to the first position using Stream

我已经编写了这段代码,我想将其转换为stream并保持相同的行为。

List<String> str1 = new ArrayList<String>();
str1.add("A");
str1.add("B");
str1.add("C");
str1.add("D");

int index = str1.indexOf("C");

if ((str1.contains("C")) && (index != 0)) {
    str1.remove("C");
    str1.add(0, "C");
}

你可以简化:

int index = str1.indexOf("C");

if ((str1.contains("C")) && (index != 0)) {
    str1.remove("C");
    str1.add(0, "C");
}

作为

if (str1.remove("C")) { 
    str1.add(0, "C"); 
}

(检查 javadoc 的remove(Object) 。它会删除它找到的 object 的第一个实例,如果 object 被删除,则返回true 。无需查找和测试对象的索引。)

在这一点上,你可能应该停下来。

  • 一个小问题是,如果"C"是第一个元素,您将删除它并再次添加它......不必要的。 您可以按如下方式处理:

     int index = str1.index("C"); if (index > 1) { str1.add(0, str1.remove(index)); }
  • 您可以进一步优化以避免重复复制删除和添加。 例如(感谢@Holger):

     Collections.rotate(str1.subList(0, str1.indexOf("C") + 1), 1);

    (但如果你说这很简单,普通的 Java 程序员可能会向你扔东西。需要仔细阅读 javadocs 才能了解这实际上是有效的。)

  • 可以将其重写为 2 个 stream 操作,但这样做没有意义。 这两种操作(首先删除并插入到流中)效率低下且难以实现。 难以实施意味着难以阅读。 由于流的主要目的是以比传统循环更容易阅读的方式表达复杂的转换......


请注意,上述解决方案是针对上述问题 但是,如果元素的 object 身份确实很重要,则上述唯一将 object移动到列表开头的解决方案是使用rotate的解决方案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM