用于列表清理的JavaOneLiner
java中是否有这样的构造(这里是用python实现的): 今天我用的是:用于列表清理的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上,您可以选择使用,或者(也可能是其他方法),
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)