Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于列表清理的JavaOneLiner_Java_Python_Collections_Closures - Fatal编程技术网

用于列表清理的JavaOneLiner

用于列表清理的JavaOneLiner,java,python,collections,closures,Java,Python,Collections,Closures,java中是否有这样的构造(这里是用python实现的): 今天我用的是: ItemType newList = new ArrayList(); for( ItemType item : oldList ) { if( item.getInt > 5) { newList.add(item); } } 对我来说,第一种方法看起来更聪明。Java 7或实现闭包,因此支持这样的功能,但目前它不支持,所以在Java VM上,您可以选择使用,或者(也可能是其他方法),

java中是否有这样的构造(这里是用python实现的):

今天我用的是:

ItemType newList = new ArrayList();
for( ItemType item : oldList ) {
    if( item.getInt > 5) {
     newList.add(item);
    }
}
对我来说,第一种方法看起来更聪明。

Java 7或实现闭包,因此支持这样的功能,但目前它不支持,所以在Java VM上,您可以选择使用,或者(也可能是其他方法),但在Java中,您只能通过使用Guava之类的帮助程序来接近这一点

JDK 7示例代码:

findItemsLargerThan(List<Integer> l, int what){
   return filter(boolean(Integer x) { x > what }, l);
}  
findItemsLargerThan(Arrays.asList(1,2,5,6,9), 5)
Arrays.asList(1,2,5,6,9).findAll{ it > 5}
Collections2.filter(Arrays.asList(1, 2, 5, 6, 9),
    new Predicate<Integer>(){
        @Override
        public boolean apply(final Integer input){
            return input.intValue() > 5;
        }
    }
);
Array(1, 2, 5, 6, 9) filter (x => x > 5)
番石榴样本代码:

findItemsLargerThan(List<Integer> l, int what){
   return filter(boolean(Integer x) { x > what }, l);
}  
findItemsLargerThan(Arrays.asList(1,2,5,6,9), 5)
Arrays.asList(1,2,5,6,9).findAll{ it > 5}
Collections2.filter(Arrays.asList(1, 2, 5, 6, 9),
    new Predicate<Integer>(){
        @Override
        public boolean apply(final Integer input){
            return input.intValue() > 5;
        }
    }
);
Array(1, 2, 5, 6, 9) filter (x => x > 5)

不,这种动态语言结构在Java中还不受支持:-),因此您必须接受选项2,您可以查看一下。有一种选择方法可用于条件。

没有什么是不可能的(-:

import java.util.ArrayList;
导入java.util.array;
导入java.util.List;
公共类列表清理器{
公共静态void main(字符串[]args){
final List oldList=Arrays.asList(新整数[]{23,4,5,
657 });
System.out.println(旧列表);
List newList=newarraylist(){
{
for(整型元素:oldList){
如果(元素>5){
添加(元素);
}
}
}
};
System.out.println(newList);
}
}

唯一的限制是oldList必须是最终的。

这可以用纯Java完成,但您需要编写一个支持类筛选器,以便成功运行以下代码:

    List<Integer> oldList = Arrays.asList(new Integer[] { 1, 2, 5, 6, 9 });
    List<Integer> newList = new Filter<Integer>(oldList) {
        {
            findAll(it > 5);
        }
    }.values();
    System.out.println(newList); // [6, 9] 
List oldList=Arrays.asList(新整数[]{1,2,5,6,9});
List newList=新过滤器(旧列表){
{
findAll(it>5);
}
}.values();
System.out.println(newList);//[6,9]
如果您想知道为什么要编译这段代码,请看一下:双大括号初始化。这将创建包含it变量的类筛选器的匿名实例,并提供方法findAll()

筛选器类本身有一个缺点,即为每个列表元素创建一个新实例,以在findAll()处计算布尔条件:

公共抽象类过滤器{
受保护的列表值=新的ArrayList();
保护它;
公共筛选器(列表值){
如果(值!=null){
this.values.addAll(值);
}
if(values.isEmpty()){
抛出新的RuntimeException(“不适用于空集合!”);
}
它=values.iterator().next();
//实例初始值设定项在此处执行,调用findAll
}
受保护的void findAll(布尔b)抛出可丢弃{
//未来呼叫的退出条件
如果(values.size()>1){
//如果值有多个条目,则仅对每个条目重复
迭代器迭代器=值。迭代器();
while(iterator.hasNext()){
//不要为第一个条目再次求值
如果(!b){
iterator.next();
iterator.remove();
b=正确;
}否则{
//为每个其他条目创建一个包含一个元素的参数
下一个列表=新的ArrayList();
add(iterator.next());
//获取匿名类的构造函数
构造函数=this.getClass().getDeclaredConstructors()[0];
//调用构造函数,然后再次执行实例初始值设定项
Filter filtered=(Filter)构造函数.newInstance(新对象[]{null,next});
//如果值为空,则条件不匹配,可以删除元素
if(filtered.values.isEmpty()){
iterator.remove();
}
}
}
}否则{
//一个元素可以直接检查
如果(!b){
value.clear();
}
}
}
公共列表值(){
返回值;
}
}
但是,由于目前创建实例的成本很低,而且Filter类可用于所有对象,因此可能值得将其包含在您的Utils包中

格里茨,
GHad

在Scala中是:
数组(1,2,5,6,9)过滤器(x=>x>5)