java distinct 实现_Java Lambda Stream Distinct()对任意键?

我经常遇到一个Java lambda表达式的问题,当我想对一个对象的任意属性或方法的一个流,但想要保持对象,而不是映射到该属性或方法。我开始创建容器,如讨论

here,但我开始做到足够让它变得恼人,并做了很多样板类。

我把这个Pairing类,它拥有两个类型的两个对象,允许你指定左,右,或两个对象的键控。我的问题是…有没有真正没有内置lambda流函数distinct()在一些关键供应商?这将真的让我感到惊讶。如果不是,这个类将可靠地实现该功能?

这里是如何被称为

BigDecimal totalShare = orders.stream().map(c -> Pairing.keyLeft(c.getCompany().getId(), c.getShare())).distinct().map(Pairing::getRightItem).reduce(BigDecimal.ZERO, (x,y) -> x.add(y));

这里是配对类

public final class Pairing {

private final X item1;

private final Y item2;

private final KeySetup keySetup;

private static enum KeySetup {LEFT,RIGHT,BOTH};

private Pairing(X item1, Y item2, KeySetup keySetup) {

this.item1 = item1;

this.item2 = item2;

this.keySetup = keySetup;

}

public X getLeftItem() {

return item1;

}

public Y getRightItem() {

return item2;

}

public static Pairing keyLeft(X item1, Y item2) {

return new Pairing(item1, item2, KeySetup.LEFT);

}

public static Pairing keyRight(X item1, Y item2) {

return new Pairing(item1, item2, KeySetup.RIGHT);

}

public static Pairing keyBoth(X item1, Y item2) {

return new Pairing(item1, item2, KeySetup.BOTH);

}

public static Pairing forItems(X item1, Y item2) {

return keyBoth(item1, item2);

}

@Override

public int hashCode() {

final int prime = 31;

int result = 1;

if (keySetup.equals(KeySetup.LEFT) || keySetup.equals(KeySetup.BOTH)) {

result = prime * result + ((item1 == null) ? 0 : item1.hashCode());

}

if (keySetup.equals(KeySetup.RIGHT) || keySetup.equals(KeySetup.BOTH)) {

result = prime * result + ((item2 == null) ? 0 : item2.hashCode());

}

return result;

}

@Override

public boolean equals(Object obj) {

if (this == obj)

return true;

if (obj == null)

return false;

if (getClass() != obj.getClass())

return false;

Pairing,?> other = (Pairing,?>) obj;

if (keySetup.equals(KeySetup.LEFT) || keySetup.equals(KeySetup.BOTH)) {

if (item1 == null) {

if (other.item1 != null)

return false;

} else if (!item1.equals(other.item1))

return false;

}

if (keySetup.equals(KeySetup.RIGHT) || keySetup.equals(KeySetup.BOTH)) {

if (item2 == null) {

if (other.item2 != null)

return false;

} else if (!item2.equals(other.item2))

return false;

}

return true;

}

}

更新:

测试Stuart的功能下面,它似乎工作很大。以下操作区分每个字符串的第一个字母。我想知道的唯一部分是ConcurrentHashMap如何只维护整个流的一个实例

public class DistinctByKey {

public static Predicate distinctByKey(Function super T,Object> keyExtractor) {

Map seen = new ConcurrentHashMap<>();

return t -> seen.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;

}

public static void main(String[] args) {

final ImmutableList arpts = ImmutableList.of("ABQ","ALB","CHI","CUN","PHX","PUJ","BWI");

arpts.stream().filter(distinctByKey(f -> f.substring(0,1))).forEach(s -> System.out.println(s));

}

输出为…

ABQ

CHI

PHX

BWI

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中的distinct用法和SQL中的distinct用法有些不同,下面分别介绍一下。 ## Javadistinct用法 在Java中,distinct主要用于去除集合中的重复元素,常用于List和Stream集合。 ### List集合中的distinct用法 ```java List<String> list = new ArrayList<>(); list.add("apple"); list.add("banana"); list.add("orange"); list.add("banana"); list.add("pear"); List<String> distinctList = list.stream().distinct().collect(Collectors.toList()); System.out.println(distinctList); ``` 输出结果为: ``` [apple, banana, orange, pear] ``` ### Stream集合中的distinct用法 ```java Stream<String> stream = Stream.of("apple", "banana", "orange", "banana", "pear"); List<String> distinctList = stream.distinct().collect(Collectors.toList()); System.out.println(distinctList); ``` 输出结果为: ``` [apple, banana, orange, pear] ``` ## SQL中distinct用法 在SQL中,distinct主要用于去除查询结果中的重复行。 ### 示例1:查询表中的不同城市 ```sql SELECT DISTINCT city FROM employee; ``` ### 示例2:查询表中的不同部门和职位 ```sql SELECT DISTINCT department, position FROM employee; ``` ### 示例3:查询表中的不同城市和部门 ```sql SELECT DISTINCT city, department FROM employee; ``` ### 示例4:根据多个字段去重查询 ```sql SELECT DISTINCT ON (city, department) city, department, position FROM employee; ``` 以上四个示例中,第一个和第二个示例比较简单,第三个示例中查询的是两个字段的组合,第四个示例中使用了DISTINCT ON关字,可以根据多个字段去重,但是只会保留第一个符合条件的记录。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值