我正在使用 PrimeFaces autoComplete 和 groupBy 函数。
<h:form>
<p:autoComplete placeholder="Select something"
size="27"
dropdown="true"
forceSelection="true"
var="value"
itemLabel="#{value}"
itemValue="#{value}"
value="#{autoCompleteGroupByBean.selection}"
completeMethod="#{autoCompleteGroupByBean.complete}"
groupBy="#{autoCompleteGroupByBean.getGroup(value)}" />
</h:form>
package org.primefaces.test.view;
import lombok.Getter;
import lombok.Setter;
import org.apache.commons.lang3.StringUtils;
import javax.annotation.PostConstruct;
import javax.faces.view.ViewScoped;
import javax.inject.Named;
import java.io.Serializable;
import java.util.*;
import java.util.stream.Collectors;
@Setter
@Getter
@Named
@ViewScoped
public class AutoCompleteGroupByBean implements Serializable {
private List<String> values;
private List<String> groups;
private String selection;
@PostConstruct
public void initialize() {
values = Arrays.asList(
"ABC value0", "ABC value1", "ABC value2", "ABC value3",
"DEF value0", "DEF value1", "DEF value2", "DEF value3",
"GHI value0", "GHI value1", "GHI value2", "GHI value3");
// If the values are not ordered, groups are occuring multiple times
// Collections.shuffle(values);
groups = Arrays.asList("ABC", "DEF", "GHI");
}
public List<String> complete(final String query) {
return values.stream()
.filter(v -> StringUtils.containsIgnoreCase(v, query))
.collect(Collectors.toList());
}
public String getGroup(final String value) {
return groups.stream()
.filter(g -> StringUtils.startsWithIgnoreCase(value, g))
.findAny()
.orElse("MISC");
}
}
如果值是有序的,它就可以正确工作:
如果值未排序(我在示例中使用
Collections.shuffle()
来执行此操作),则组会出现多次:
在我的实际项目中,我从外部服务获取值,并且组并不总是像示例中那样位于条目的开头。 有什么方法可以避免重复的组或者我需要提前对所有值进行排序吗?
感谢您的帮助!
按照建议,我通过按组对所有值进行排序来解决这个问题。
PrimeFaces 文档中未记录
groupBy
。更容易理解的是,需要对值进行排序才能使其工作。