gpt4 book ai didi

java - 以某个对象开始的子列表

转载 作者:行者123 更新时间:2023-12-01 22:57:25 26 4
gpt4 key购买 nike

我有一个对象列表,我想从满足特定条件的对象开始迭代子列表。

(具体来说,类的声明字段列表,以字段某某开头,通过名称而不是整数索引来识别。)

显然,一种解决方案是迭代整个列表,在找到特定对象时设置一个标志,但我突然想知道 Java 8 是否改进了对高阶编程的支持,提供了一种更优雅的方法方法来做到这一点。

在 Java 8 中执行此操作最优雅/惯用的方法是什么? (性能不是考虑因素;相关代码在每次程序执行时只会运行一次。)

最佳答案

您似乎想要 indexOf方法充当谓词,您可以在其中提供自定义属性来判断是否找到第一个满足它的对象。

可以使用辅助方法来完成。

static <T> List<T> getSubList(List<T> list, Predicate<T> pred){
return list.subList(list.indexOf(list.stream().filter(pred).findFirst().get()), list.size());
}

它的作用是:

  • 获取 Stream<T> 从列表中
  • 对其应用过滤器
  • 查找满足给定谓词的第一个元素
  • 获取结果中的对象 Optional<T> 调用get()
  • 使用indexOf在列表中获取该对象的索引
  • 返回sublist原始列表

然后你可以这样调用它;

List<MyClass> subList = getSubList(list, o -> o.b.startsWith("10"));

举一个小例子,以下是如何从第一个对象中获取子列表,其中第一个对象的字符串值以 10 开头,直到列表末尾。

public class Test { 
public static void main(String[] args) {
List<MyClass> list = new ArrayList<>();
for(int i = 0; i < 15; i++){
list.add(new MyClass(i, String.valueOf(i)));
}
System.out.println(getSubList(list, o -> o.s.startsWith("10"))); //[MyClass [a=10, b=10], MyClass [a=11, b=11], MyClass [a=12, b=12], MyClass [a=13, b=13], MyClass [a=14, b=14]]

}
static <T> List<T> getSubList(List<T> list, Predicate<T> pred){
return list.subList(list.indexOf(list.stream().filter(pred).findFirst().get()), list.size());
}
}
class MyClass {
int i;
String s;
public MyClass(int i,String s){
this.i = i;
this.s = s;
}
@Override
public String toString() {
return "MyClass [i=" + i + ", s=" + s + "]";
}

}

您可以添加更多检查,例如查看是否有 Optional 中的值(使用 isPresent() )您可以通过调用 findFirst 获得,但你已经知道如何去做的主要想法。

希望对您有帮助! :)

关于java - 以某个对象开始的子列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23839357/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com