java 集合拷贝删除_如何删除List JAVA 8中的重复项

选项1:过滤

predicate – a 07001, 07002 predicate to apply to each element to determine if it should be included

public class NoRepeatFilter implements Predicate {

private T prevValue;

@Override

public boolean test(T value) {

if (value.equals(this.prevValue))

return false;

this.prevValue = value;

return true;

}

}

测试

List result = Stream

.of("A", "A", "A", "B", "B", "A", "A", "A", "C", "C", "C", "A", "A", "B", "B", "A")

// .parallel()

.filter(new NoRepeatFilter<>())

.collect(Collectors.toList());

System.out.println(result);

产量

[A,B,A,C,A,B,A]

它必须是无状态的原因是如果流是并行的,它将失败,例如,使用.parallel()再次运行测试取消注释:

[A,A,B,B,A,C,C,C,A,B,B,A]

选项2:收集者

一个有效的解决方案是使用of(...)创建自己的Collector:

public class NoRepeatCollector {

public static Collector> get() {

return Collector.of(ArrayList::new,

NoRepeatCollector::addNoRepeat,

NoRepeatCollector::combineNoRepeat);

}

private static void addNoRepeat(List list, E value) {

if (list.isEmpty() || ! list.get(list.size() - 1).equals(value))

list.add(value);

}

private static List combineNoRepeat(List left, List right) {

if (left.isEmpty())

return right;

if (! right.isEmpty())

left.addAll(left.get(left.size() - 1).equals(right.get(0))

? right.subList(1, right.size()) : right);

return left;

}

}

测试

List result = Stream

.of("A", "A", "A", "B", "B", "A", "A", "A", "C", "C", "C", "A", "A", "B", "B", "A")

// .parallel()

.collect(NoRepeatCollector.get());

System.out.println(result);

输出(有和没有.parallel())

[A,B,A,C,A,B,A]

选项3:循环

如果输入是List(或其他Iterable),则可以使用简单循环删除重复值:

public static void removeRepeats(Iterable iterable) {

E prevValue = null;

for (Iterator iter = iterable.iterator(); iter.hasNext(); ) {

E value = iter.next();

if (value.equals(prevValue))

iter.remove();

else

prevValue = value;

}

}

测试

List list = new ArrayList<>(Arrays.asList(

"A", "A", "A", "B", "B", "A", "A", "A", "C", "C", "C", "A", "A", "B", "B", "A"));

removeRepeats(list);

System.out.println(list);

产量

[A,B,A,C,A,B,A]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值