Java使用仿函数连接集合

给出了2个具有相同数量元素的集合,比如ListJAVA有哪些优雅的方法可以在具有相应索引的集合的每个2个元素上应用仿函数?

比如,一个例子可能是:
List = { "APPLE", "PEAR" };
List = { "BANANA", "ORANGE" };

将字符串连接在一起的谓词将导致以下List
List = { "APPLEBANANA", "PEARORANGE" };

类似于Apache Commons Collections中的functor,我在过去创建了二进制等价物。

对于您的情况,可以使用二进制转换器类型对象,它接受两个输入对象并返回单个对象。 以下是一些示例代码,它传达了我的方法:

 // tranformer interface BinaryTransformer { Z transform(X a, Y b); } // implementation for your problem class ConcatTransformer implements BinaryTransformer { public String transform(String a, String b) { return a + b; } } // general use transformer class BinaryListUtils { public static  List collect(List aList, List bList, BinaryTransformer t) { List ret = new ArrayList(aList.size()); Iterator aIter = aList.iterator(); Iterator bIter = bList.iterator(); while(aIter.hasNext()) { ret.add(t.transform(aIter.next(), bIter.next())); } } } 

HTH

一个快速的驱动程序显示它工作。 不对所有测试用例负责。 🙂

 List combineListsHorizontally(List a, List b) { assert a.size() == b.size(); // just avoids some checks List result = new ArrayList(a.size()); Iterator itera = a.iterator(); Iterator iterb = b.iterator(); for(int i = 0; i < a.size(); i++) { String combined = itera.next() + iterb.next(); result.add(combined); } return result; } 

如果你需要通用的东西,你需要知道他们可以加入它们的方式

  List combineListsHorizontally(List a, List b) { assert a.size() == b.size(); // just avoids some checks List result = new ArrayList(a.size()); Iterator itera = a.iterator(); Iterator iterb = b.iterator(); for(int i = 0; i < a.size(); i++) { E combined = new MagicCombiner(a,b).get(); // define this line yourself result.add(combined); } return result; } 

/////////////////编辑 - 这是一个基于@Brents(优秀)示例的工作示例。 向他展示了比我更好地说明这种模式的道具。

 import java.util.*; /** * Compile: "javac BinaryListUtils" * Usage: "java BinaryListUtils" C:\Documents and Settings\user\My Documents>javac BinaryListUtils.java C:\Documents and Settings\user\My Documents>java BinaryListUtils APPLEBANANA PEARORANGE C:\Documents and Settings\user\My Documents> */ // general use transformer class BinaryListUtils { // tranformer static interface BinaryTransformer { Z transform(X a, Y b); } // implementation for your problem static class ConcatTransformer implements BinaryTransformer { public String transform(String a, String b) { return a + b; } } public static  List collect(List aList, List bList, BinaryTransformer t) { List ret = new ArrayList(aList.size()); Iterator aIter = aList.iterator(); Iterator bIter = bList.iterator(); while(aIter.hasNext()) { ret.add(t.transform(aIter.next(), bIter.next())); } return ret; } public static void main(String[] args) { List aList = new ArrayList(); List bList = new ArrayList(); aList.add("APPLE"); aList.add("PEAR"); bList.add("BANANA"); bList.add("ORANGE"); ConcatTransformer ct = new ConcatTransformer(); List cList = BinaryListUtils.collect(aList,bList,ct); for(String s : cList) System.out.println(s); } } 

你所要求的不是谓词。 它正在对压缩在一起的列表进行转换。 执行此操作的一般方法是编写可迭代的拉链,将两个列表压缩为一对的可迭代,然后将转换应用于对。

我最初认为你要求两个集合的交集,它在Guava集合中作为Sets.intersection(Set,Set)提供。

我认为你最好的选择就是迭代地做。 我想不出任何可以做到的核心Java API。

 public List predicate(List list1, List list2) { List list = new ArrayList(); for(int i = 0; i < list1.size(); i++) { list.add(new StringBuilder(list1.get(i)).append(list2.get(i)).toString()); } return list; } 

没有编译/运行它。 祝你好运。