【发布时间】:2011-06-25 13:00:13
【问题描述】:
我对 Guava 和它的风格有点陌生。我肯定在挖掘它,但我一直绊倒的一件事是链式方法的顺序。我似乎遇到这个问题最多的地方是使用复合Orderings 时。我必须不断问自己以下问题:
-
natural去哪儿了? -
nullFirst(或最后一个)去哪里了? - 哪个
nullsFirst做什么? (在下面的示例中,一个用于主机,一个用于姓氏,一个用于名字?)
这是我刚刚研究的一个示例。它看起来很麻烦,我只是不确定我是否把它们放在一起正确。我有一些 JUnit 来测试它,看起来还不错,但总是有那些古怪的边界情况。
Ordering<Host> lastNameThenFirstNameOrdering = Ordering.natural().nullsFirst().onResultOf(new Function<Host, String>() {
public String apply(Host host) {
return host.getLastName();
}}).compound(Ordering.natural().nullsFirst().onResultOf(new Function<Host, String>() {
public String apply(Host host) {
return host.getFirstName();
}})).nullsFirst();
至于一个实际的问题:这些事情如何执行是否有明确的规则?这似乎是从后到先的,但我很难说清楚。
编辑:只是想指出我试图替换的大而丑陋的代码:
Ordering<Host> ordering2 = new Ordering<Host>() {
public int compare(Host host1, Host host2) {
if (host1 == null || host2 == null) {
return host1 == host2 ? 0 : ((host1 == null) ? -1 : 1);
}
if(host1.getLastName() != null || host2.getLastName() != null){
if (host1.getLastName() == null) {
return -1;
} else if (host2.getLastName() == null) {
return 1;
}
if (host1.getLastName().compareTo(host2.getLastName()) != 0) {
return host1.getLastName().compareTo(host2.getLastName());
}
}
if (host1.getFirstName() == null) {
return -1;
} else if (host2.getFirstName() == null) {
return 1;
}
return host1.getFirstName().compareTo(host2.getFirstName());
}};
【问题讨论】:
-
或者这太乱了甚至不值得?也许我应该打破两个子排序,并以更具表现力的方式组合它们..
-
方法链接旨在使代码在某些情况下更具可读性。在这种情况下,它会伤害您的代码、该代码的未来维护者以及阅读您问题的每个人的眼睛
-
您是否建议我应该通过自定义实现来做到这一点?我不确定这是否不那么令人眼花缭乱:(添加到帖子中)
标签: java guava method-chaining