Lamdbaj允许在Java语言中定义闭包,可以在这里找到各种示例
我的问题是关于使用的底层Java机制,例如,定义println闭包,使用以下代码:
Closure println = closure();
{ of(System.out).println(var(String.class)); }
Run Code Online (Sandbox Code Playgroud)
随后可以通过以下方式执行此关闭:
println.apply("foobar");
Run Code Online (Sandbox Code Playgroud)
我很好奇Java中的哪些机制允许调用of(...).println(...)与println实例本身相关联.
当然,lambdaj源代码可供阅读,但我希望有更高级别的解释,如果有人有一个.我的反思技巧可以动态地进行一些内省和执行方法.
Lambdaj(以及其他一些类似的库)提供了一个having函数,它允许我像这样定义谓词(例如直接来自lambdaj Features页面):
List<Person> oldFriends =
filter(having(on(Person.class).getAge(), greaterThan(30)), meAndMyFriends);
Run Code Online (Sandbox Code Playgroud)
我非常希望能够使用简单的字符串语法定义我的Java谓词对象"age > 30"- 类似于SQL where子句 - 所以上面的过滤器变成了类似的东西:
List<Person> oldFriends =
filter(having(Person.class, "age > 30"), meAndMyFriends);
Run Code Online (Sandbox Code Playgroud)
这样的库是否存在,或者是否有人可以为我自己构建一个查询解析部分推荐一些构建块?我实际上并不介意它创造了什么样的谓词(hamcrest,guava等).
在我的头脑中,我可以想到它支持的许多事情:平等和不平等,自定义和原始类型,和/或/不,括号,LIKE(对于字符串),in(...)enum的解释名称,属性的属性.
这是一个更复杂的谓词的例子:
"salesCount > 10 and (country='UK' or city='New York')
and attitude not in (MENACING, RUDE)
and product.name <> 'Widget' "
Run Code Online (Sandbox Code Playgroud)
(此示例假定谓词应用于的SalesPerson类(比如一个类)具有方法getSalesCount(),getCountry()和getCity(),以及getAttitude()(返回枚举).它还具有属性getProduct,返回带有getName方法的类型.
动机:我们有一个客户端 - 服务器系统,它有多种语言API(目前是Java和C#); 我正在寻找一种语言无关的方式让用户指定一个谓词,该谓词过滤一组对象,其中的确切内容只有服务器进程知道(用Java编写).
我有两个类:
public class Order{
private Integer id;
private List<Position> positions;
...
}
public class Position{
private Integer id;
private String content;
...
}
Run Code Online (Sandbox Code Playgroud)
现在,我有一个包含订单的列表,并希望获得具有特定内容的所有订单.目前我这样做:
List<Order> orders = ... ;
List<Order> outputOrders = ... ;
for(Order order : orders){
if(select(order.getPositions(), having(on(Position.class).getContent(),equalTo("Something"))).size() != 0){
outputOrders.add(order);
}
}
Run Code Online (Sandbox Code Playgroud)
使用lambdaj有更好的方法吗?
提前致谢.
你知道,相当于:
<T> T single(List<T> list) {
assertEquals(1, list.size());
return list.get(0);
}
Run Code Online (Sandbox Code Playgroud)
lambdaj 包含类似的东西吗?
我试图通过org.hamcrest.Matchers匹配Object的两个不同属性.这里是:
List<LeaveApply> leaveApplyList = Lambda.select(
allLeaveApplyList,
Matchers.allOf(
Lambda.having(
Lambda.on(LeaveApply.class).getUser().getId(),
Matchers.equalTo(userId)),
Lambda.having(
Lambda.on(LeaveApply.class).getDate(),
Matchers.allOf(
Matchers.greaterThanOrEqualTo(fromDate),
Matchers.lessThanOrEqualTo(toDate)))
)
);
Run Code Online (Sandbox Code Playgroud)
它给出一个LeaveApply对象列表,其中user-id等于给定的id和日期小于或等于to-date且大于或等于from-date.这是工作.我想知道它是匹配不同属性字段的正确方法吗?
我想将值设置为对象的字段,以便它首先获取该字段的先前值并向其追加内容并将其设置为该字段.
在LambdaJ中forEach我们可以这样做:
forEach(myCollection).setFieldValue("someValue");
但我需要的是:
forEach(myCollection).setFieldValue(getFieldValue() + "someValue");
LambdaJ有可能吗?
我有一个简单的pojo:
class UserId {
String ssn;
String otsId;
Integer actorId;
public UserId(String ssn, String otsId, Integer actorId) {
this.ssn = ssn;
this.otsId = otsId;
this.actorId = actorId;
}
@Override
public String toString() {
return "[otsId=" + otsId + ", ssn=" + ssn + ", actorId=" + actorId + "]";
}
}
Run Code Online (Sandbox Code Playgroud)
我想从那里提取所有ssn值的所有值List<String>.所以我只是作为一个例子写道:
public class UserIdTest {
public static void main(String[] args) {
List<UserId> list = new ArrayList<UserId>();
list.add(new UserId("111111-1111", "12345678", new Integer(234589235)));
list.add(new UserId("111111-1111", "12345678", new …Run Code Online (Sandbox Code Playgroud) 我希望能够使用lambdaj将子列表组合成单个列表.
我有一个有效的迭代版本:
// HDU elements are children of each subsystem
Collection<SpaceSystemType> subsystems = this.getAllSubsystems();
Set<SpaceSystemType> sources = new HashSet<SpaceSystemType>();
// Iterate the subsystems, collecting all the sources
for (SpaceSystemType subsystem : subsystems)
sources.addAll(subsystem.getSpaceSystem()); // getSpaceSystem returns a List<SpaceSystemType>
return sources;
Run Code Online (Sandbox Code Playgroud)
我希望能够这样做:
extract(subsystems, on(SpaceSystemType.class).getSpaceSystem());
Run Code Online (Sandbox Code Playgroud)
但提取物返回a
List<List<SpaceSystemType>>
Run Code Online (Sandbox Code Playgroud)
所以我必须使用错误的命令.
哪个lambdaj命令实现了我想要的?
我喜欢lambdaj并且经常使用它,但我似乎无法弄清楚是否可以使用多种排序条件对列表进行排序.
以下是使用Google Collections的示例.可以在lambdaj中完成同样的事情吗?
首先按颜色排序,然后按名称排序:
Function<Fruit, Color> getColorFunction = new Function<Fruit, Color>() {
public Color apply(Fruit from) {
return from.getColor();
}
};
Function<Fruit, String> getNameFunction = new Function<Fruit, String>() {
public String apply(Fruit from) {
return from.getName();
}
};
Ordering<Fruit> colorOrdering = Ordering.natural().onResultOf(getColorFunction);
Ordering<Fruit> nameOrdering = Ordering.natural().onResultOf(getNameFunction);
Ordering<Fruit> colorAndNameOrdering = colorOrdering.compound(nameOrdering);
ImmutableSortedSet<Fruit> sortedFruits = ImmutableSortedSet.orderedBy(
colorAndNameOrdering).addAll(fruits).build();
Run Code Online (Sandbox Code Playgroud) 使用Lambdaj,我试图从列表中隔离满足2个单独条件的对象.以下两个都将实现我的目标.一个)
List<SomeObject> someObjectsWithMatchingSomeObjectIds = select(foo.getSomeParentObject().getSomeObjects(), having(on(
SomeObject.class).getId(), equalTo(123)));
SomeObject someObject = selectFirst(someObjectsWithMatchingSomeObjectIds, having(on(SomeObject.class).getLoanTerm(),
notNullValue()));
Run Code Online (Sandbox Code Playgroud)
B)
SomeObject someObject = selectFirst(select(foo.getSomeParentObject().getSomeObjects(), having(on(SomeObject.class)
.getId(), equalTo(123))), having(on(SomeObject.class).getLoanTerm(), notNullValue()));
Run Code Online (Sandbox Code Playgroud)
第一个似乎更具可读性,特别是对于不熟悉API的人.第二个似乎利用了lambdaj的函数式编程方面,哪个最好?
我认为可读性赢了.但是,我想知道,使用LambdaJ过滤集合时是否有更简洁的方法来处理两个独立的条件?
我正在尝试在Android上使用lambdaj,但是每次调用我都会得到异常(java.lang.ExceptionInInitializerError).
填充集合的类是:
@DatabaseTable(tableName = "sections")
public class Section {
@DatabaseField(id = true, unique = true)
private int id;
@DatabaseField(canBeNull = false)
private String name;
public Section() {
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Run Code Online (Sandbox Code Playgroud)
ORMLite使用注释.我离开了他们,以防他们以某种方式相关.我怀疑它.
现在,如果我尝试做一个简单的调用,它会崩溃:
List<Section> sections = fillSections(); //this is correctly filled
select(sections, having(on(Section.class).getId(), Matchers.greaterThan(1)))
Run Code Online (Sandbox Code Playgroud)
logcat的:
FATAL EXCEPTION: main
java.lang.ExceptionInInitializerError
at …Run Code Online (Sandbox Code Playgroud)