如何解决如何遍历List <?在Java中扩展E>并使用实际对象?
所以我知道要进行迭代,我可以使用for-each或Iterator。但是我的问题是我想通过条件删除某些元素来创建相同类型的新列表。 对于前
List<? extends E> myList;
List<? extends E> newList = new ArrayList<>();
for(E element: myList) {
if(element.getName().equals("abc")) {
newList.add(element); // would throw an error because the list is of a different type.
}
}
我该怎么做?有什么其他方法可以解决这个问题吗?
解决方法
您可以尝试这样:
List<? extends E> newList = myList.stream().filter(x -> x.getName().equals("abc")).collect(Collectors.toList());
但是,如果您需要隐藏在“?”后面的类型。那么您将需要在循环内部检查element是否是某个类的实例,但是无法将您的元素添加到List
这将起作用:
public static void main(String[] args) {
List<? extends E> myList = new ArrayList<>();;
List<E> newList = new ArrayList<>();
for(E element: myList) {
if (element instanceof D) {
D elementD = (D)element;
if(elementD.getName().equals("abc")) {
newList.add(elementD); // would throw an error because the list is of a different type.
}
}
}
}
这也将起作用
public static void main(String[] args) {
List<? extends E> myList = new ArrayList<>();;
List<D> newList = new ArrayList<>();
for(E element: myList) {
if (element instanceof D) {
D elementD = (D)element;
if(elementD.getName().equals("abc")) {
newList.add(elementD); // would throw an error because the list is of a different type.
}
}
}
}
但这不起作用:
public static void main(String[] args) {
List<? extends E> myList = new ArrayList<>();;
List<? extends E> newList = new ArrayList<>();
for(E element: myList) {
if (element instanceof D) {
D elementD = (D)element;
if(elementD.getName().equals("abc")) {
newList.add(elementD); // would throw an error because the list is of a different type.
}
}
}
}
,
您不能将任何非null
的值添加到List<? extends E>
,因为编译器无法验证类型是否与未知类型匹配。
您需要告诉编译器两个列表实际上是相同类型的,以允许这样做。您可以通过将代码提取到单独的方法中来做到这一点:
List<? extends E> myList;
List<? extends E> newList = filterList(myList);
...
private <T extends E> List<T> filterList(List<T> myList) {
List<T> newList = new ArrayList<>();
for(T element: myList) {
if(element.getName().equals("abc")) {
newList.add(element);
}
}
return newList;
}
这样,您基本上可以“命名”匿名类型? extend E
,并在方法调用期间将其命名为T
。现在,编译器知道您的工作是合法的。
我做了类似的事情
mylist.removeIf(element -> element.getName().equals("abc"));
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。