Java Code Examples for java.util.Map#putIfAbsent()
The following examples show how to use
java.util.Map#putIfAbsent() .
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example 1
Source File: ProcessorModuleReactor.java From yangtools with Eclipse Public License 1.0 | 6 votes |
@SuppressFBWarnings(value = "RCN_REDUNDANT_NULLCHECK_WOULD_HAVE_BEEN_A_NPE", justification = "https://github.com/spotbugs/spotbugs/issues/600") private static Collection<YangTextSchemaSource> toUniqueSources(final Collection<ScannedDependency> dependencies) throws IOException { final Map<String, YangTextSchemaSource> byContent = new HashMap<>(); for (ScannedDependency dependency : dependencies) { for (YangTextSchemaSource s : dependency.sources()) { try (Reader reader = s.asCharSource(StandardCharsets.UTF_8).openStream()) { final String contents = CharStreams.toString(reader); byContent.putIfAbsent(contents, s); } } } return byContent.values(); }
Example 2
Source File: TopicReplicationFactorAnomalyFinder.java From cruise-control with BSD 2-Clause "Simplified" License | 6 votes |
/** * Scan through topics to check whether the topic having partition(s) with bad replication factor. For each topic, the * target replication factor to check against is the maximum value of {@link #SELF_HEALING_TARGET_TOPIC_REPLICATION_FACTOR_CONFIG} * and topic's minISR plus value of {@link #TOPIC_REPLICATION_FACTOR_MARGIN_CONFIG}. * * @param topicsToCheck Set of topics to check. * @return Map of detected topic replication factor anomaly entries by target replication factor. */ private Map<Short, Set<TopicReplicationFactorAnomalyEntry>> populateBadTopicsByReplicationFactor(Set<String> topicsToCheck, Cluster cluster) { Map<Short, Set<TopicReplicationFactorAnomalyEntry>> topicsByReplicationFactor = new HashMap<>(); for (String topic : topicsToCheck) { if (_cachedTopicMinISR.containsKey(topic)) { short topicMinISR = _cachedTopicMinISR.get(topic).minISR(); short targetReplicationFactor = (short) Math.max(_targetReplicationFactor, topicMinISR + _topicReplicationFactorMargin); int violatedPartitionCount = 0; for (PartitionInfo partitionInfo : cluster.partitionsForTopic(topic)) { if (partitionInfo.replicas().length != targetReplicationFactor) { violatedPartitionCount++; } } if (violatedPartitionCount > 0) { topicsByReplicationFactor.putIfAbsent(targetReplicationFactor, new HashSet<>()); topicsByReplicationFactor.get(targetReplicationFactor).add( new TopicReplicationFactorAnomalyEntry(topic, (double) violatedPartitionCount / cluster.partitionCountForTopic(topic))); } } } return topicsByReplicationFactor; }
Example 3
Source File: Utils.java From Nukkit with GNU General Public License v3.0 | 6 votes |
public static <T, U, V extends U> U getOrCreate(Map<T, U> map, Class<V> clazz, T key) { U existing = map.get(key); if (existing != null) { return existing; } try { U toPut = clazz.newInstance(); existing = map.putIfAbsent(key, toPut); if (existing == null) { return toPut; } return existing; } catch (InstantiationException | IllegalAccessException e) { throw new RuntimeException(e); } }
Example 4
Source File: SettingManager.java From Shadbot with GNU General Public License v3.0 | 5 votes |
private Map<String, BaseSetting> initialize(BaseSetting... settings) { final Map<String, BaseSetting> map = new LinkedHashMap<>(); for (final BaseSetting setting : settings) { for (final String name : setting.getNames()) { if (map.putIfAbsent(name, setting) != null) { DEFAULT_LOGGER.error("Setting name collision between {} and {}", name, map.get(name).getClass().getSimpleName()); } } } DEFAULT_LOGGER.info("{} settings initialized", settings.length); return Collections.unmodifiableMap(map); }
Example 5
Source File: DirectoryPartitioner.java From samza with Apache License 2.0 | 5 votes |
private List<List<FileMetadata>> generatePartitionGroups(List<FileMetadata> filteredFiles) { Map<String, List<FileMetadata>> map = new HashMap<>(); for (FileMetadata fileMetadata : filteredFiles) { String groupId = extractGroupIdentifier(fileMetadata.getPath()); map.putIfAbsent(groupId, new ArrayList<>()); map.get(groupId).add(fileMetadata); } List<List<FileMetadata>> ret = new ArrayList<>(); // sort the map to guarantee consistent ordering List<String> sortedKeys = new ArrayList<>(map.keySet()); sortedKeys.sort(Comparator.naturalOrder()); sortedKeys.stream().forEach(key -> ret.add(map.get(key))); return ret; }
Example 6
Source File: RestApiPrivilegesEvaluator.java From deprecated-security-advanced-modules with Apache License 2.0 | 5 votes |
private Map<Endpoint, List<Method>> addGloballyDisabledEndpoints(Map<Endpoint, List<Method>> endpoints) { if(globallyDisabledEndpoints != null && !globallyDisabledEndpoints.isEmpty()) { Set<Endpoint> globalEndoints = globallyDisabledEndpoints.keySet(); for(Endpoint endpoint : globalEndoints) { endpoints.putIfAbsent(endpoint, new LinkedList<>()); endpoints.get(endpoint).addAll(globallyDisabledEndpoints.get(endpoint)); } } return endpoints; }
Example 7
Source File: ModuleEffectiveStatementImpl.java From yangtools with Eclipse Public License 1.0 | 5 votes |
private ModuleEffectiveStatementImpl(final @NonNull ModuleStmtContext ctx) { super(ctx, findPrefix(ctx.delegate(), "module", ctx.getStatementArgument())); submodules = ctx.getSubmodules(); qnameModule = verifyNotNull(ctx.getFromNamespace(ModuleCtxToModuleQName.class, ctx.delegate())); final String localPrefix = findFirstEffectiveSubstatementArgument(PrefixEffectiveStatement.class).get(); final Builder<String, ModuleEffectiveStatement> prefixToModuleBuilder = ImmutableMap.builder(); prefixToModuleBuilder.put(localPrefix, this); appendPrefixes(ctx, prefixToModuleBuilder); prefixToModule = prefixToModuleBuilder.build(); final Map<QNameModule, String> tmp = Maps.newLinkedHashMapWithExpectedSize(prefixToModule.size() + 1); tmp.put(qnameModule, localPrefix); for (Entry<String, ModuleEffectiveStatement> e : prefixToModule.entrySet()) { tmp.putIfAbsent(e.getValue().localQNameModule(), e.getKey()); } namespaceToPrefix = ImmutableMap.copyOf(tmp); final Map<String, StmtContext<?, ?, ?>> includedSubmodules = ctx.getAllFromCurrentStmtCtxNamespace(IncludedSubmoduleNameToModuleCtx.class); nameToSubmodule = includedSubmodules == null ? ImmutableMap.of() : ImmutableMap.copyOf(Maps.transformValues(includedSubmodules, submodule -> (SubmoduleEffectiveStatement) submodule.buildEffective())); final Map<QName, StmtContext<?, ExtensionStatement, ExtensionEffectiveStatement>> extensions = ctx.getAllFromCurrentStmtCtxNamespace(ExtensionNamespace.class); qnameToExtension = extensions == null ? ImmutableMap.of() : ImmutableMap.copyOf(Maps.transformValues(extensions, StmtContext::buildEffective)); final Map<QName, StmtContext<?, FeatureStatement, FeatureEffectiveStatement>> features = ctx.getAllFromCurrentStmtCtxNamespace(FeatureNamespace.class); qnameToFeature = features == null ? ImmutableMap.of() : ImmutableMap.copyOf(Maps.transformValues(features, StmtContext::buildEffective)); final Map<QName, StmtContext<?, IdentityStatement, IdentityEffectiveStatement>> identities = ctx.getAllFromCurrentStmtCtxNamespace(IdentityNamespace.class); qnameToIdentity = identities == null ? ImmutableMap.of() : ImmutableMap.copyOf(Maps.transformValues(identities, StmtContext::buildEffective)); }
Example 8
Source File: TestReportEngine.java From testgrid with Apache License 2.0 | 5 votes |
/** * Returns a predicate for distinction by the given fields. * * @param keyExtractors key extractors * @param <T> type of the predicate * @return predicate for distinction by the given fields */ @SafeVarargs private final <T> Predicate<T> distinctByKeys(Function<? super T, ?>... keyExtractors) { final Map<List<?>, Boolean> seen = new ConcurrentHashMap<>(); return t -> { final List<?> keys = Arrays.stream(keyExtractors) .map(ke -> ke.apply(t)) .collect(Collectors.toList()); return seen.putIfAbsent(keys, Boolean.TRUE) == null; }; }
Example 9
Source File: KolmogorovSmirnovTestTest.java From hipparchus with Apache License 2.0 | 5 votes |
/** * Checks exactP for all actually attained D values against the implementation * in Commons Math 3.4.1. See {@link #exactP341(double, int, int, boolean)} * which duplicates that code. * * The brute force implementation enumerates all n-m partitions and counts the * number with p-values less than d, so it really is exact (but slow). This test * compares current code with the 3.4.1 implementation. Set maxSize higher to * extend the test to more values. Since the 3.4.1 code is very slow, setting * maxSize higher than 8 will make this test case run a long time. */ @Test public void testExactP341RealD() { final double tol = 1e-12; final int maxSize = 6; for (int m = 2; m < maxSize; m++) { for (int n = 2; n < maxSize; n++ ) { // Not actually used for the test, but dValues basically stores // the ks distribution - keys are d values and values are p-values final Map<Double, Double> dValues = new TreeMap<>(); final Iterator<int[]> combinationsIterator = CombinatoricsUtils.combinationsIterator(n + m, n); final double[] nSet = new double[n]; final double[] mSet = new double[m]; while (combinationsIterator.hasNext()) { // Generate an n-set final int[] nSetI = combinationsIterator.next(); // Copy the n-set to nSet and its complement to mSet int j = 0; int k = 0; for (int i = 0; i < n + m; i++) { if (j < n && nSetI[j] == i) { nSet[j++] = i; } else { mSet[k++] = i; } } final KolmogorovSmirnovTest kStatTest = new KolmogorovSmirnovTest(); final double curD = kStatTest.kolmogorovSmirnovStatistic(nSet, mSet); final double curP = kStatTest.exactP(curD, m, n, true); dValues.putIfAbsent(curD, curP); Assert.assertEquals( exactP341(curD, m, n, true), kStatTest.exactP(curD, m, n, true), tol); } } } // Add code to display / persist dValues here if desired }
Example 10
Source File: ZkTestBase.java From helix with Apache License 2.0 | 5 votes |
protected List<LiveInstance> setupLiveInstances(String clusterName, int[] liveInstances) { HelixZkClient.ZkClientConfig clientConfig = new HelixZkClient.ZkClientConfig(); clientConfig.setZkSerializer(new ZNRecordSerializer()); List<LiveInstance> result = new ArrayList<>(); for (int i = 0; i < liveInstances.length; i++) { String instance = "localhost_" + liveInstances[i]; _liveInstanceOwners.putIfAbsent(clusterName, new HashMap<>()); Map<String, HelixZkClient> clientMap = _liveInstanceOwners.get(clusterName); clientMap.putIfAbsent(instance, DedicatedZkClientFactory.getInstance() .buildZkClient(new HelixZkClient.ZkConnectionConfig(ZK_ADDR), clientConfig)); HelixZkClient client = clientMap.get(instance); ZKHelixDataAccessor accessor = new ZKHelixDataAccessor(clusterName, new ZkBaseDataAccessor<>(client)); Builder keyBuilder = accessor.keyBuilder(); LiveInstance liveInstance = new LiveInstance(instance); // Keep setting the session id in the deprecated field for ensure the same behavior as a real participant. // Note the participant is doing so for backward compatibility. liveInstance.setSessionId(Long.toHexString(client.getSessionId())); // Please refer to the version requirement here: helix-core/src/main/resources/cluster-manager-version.properties // Ensuring version compatibility can avoid the warning message during test. liveInstance.setHelixVersion("0.4"); accessor.setProperty(keyBuilder.liveInstance(instance), liveInstance); result.add(accessor.getProperty(keyBuilder.liveInstance(instance))); } return result; }
Example 11
Source File: CustomCommandLineTest.java From bazel with Apache License 2.0 | 5 votes |
@Test public void testKeyComputation() { NestedSet<String> values = NestedSetBuilder.<String>stableOrder().add("a").add("b").build(); ImmutableList<CustomCommandLine> commandLines = ImmutableList.<CustomCommandLine>builder() .add(builder().add("arg").build()) .add(builder().addFormatted("--foo=%s", "arg").build()) .add(builder().addPrefixed("--foo=%s", "arg").build()) .add(builder().addAll(values).build()) .add(builder().addAll(VectorArg.addBefore("--foo=%s").each(values)).build()) .add(builder().addAll(VectorArg.join("--foo=%s").each(values)).build()) .add(builder().addAll(VectorArg.format("--foo=%s").each(values)).build()) .add( builder() .addAll(VectorArg.of(values).mapped((s, args) -> args.accept(s + "_mapped"))) .build()) .build(); // Ensure all these command lines have distinct keys ActionKeyContext actionKeyContext = new ActionKeyContext(); Map<String, CustomCommandLine> digests = new HashMap<>(); for (CustomCommandLine commandLine : commandLines) { Fingerprint fingerprint = new Fingerprint(); commandLine.addToFingerprint(actionKeyContext, fingerprint); String digest = fingerprint.hexDigestAndReset(); CustomCommandLine previous = digests.putIfAbsent(digest, commandLine); if (previous != null) { fail( String.format( "Found two command lines with identical digest %s: '%s' and '%s'", digest, Joiner.on(' ').join(previous.arguments()), Joiner.on(' ').join(commandLine.arguments()))); } } }
Example 12
Source File: CommonEnumService.java From spring-cloud-shop with MIT License | 5 votes |
public Response<Map<String, List<EnumResponse>>> getCommonEnumInfo() { Map<String, List<EnumResponse>> result = Maps.newHashMap(); result.putIfAbsent(Constants.Type.OFFER_TYPE, getOfferType()); result.putIfAbsent(Constants.Type.GOODS_TYPE, getGoodsType()); result.putIfAbsent(Constants.Type.ORDER_TYPE, getOrderType()); result.putIfAbsent(Constants.Type.ORDER_STATUS, getOrderStatus()); result.putIfAbsent(Constants.Type.MODULE_TYPE, getModuleType()); result.putIfAbsent(Constants.Type.BANNER_TYPE, getBannerType()); result.putIfAbsent(Constants.Type.SHARE_CHANNEL, getBannerShareChannel()); return new Response<>(result); }
Example 13
Source File: FlatListProof.java From exonum-java-binding with Apache License 2.0 | 4 votes |
/** * Indexes proof entries by their height, also verifying their local correctness: * no out-of-range nodes; no duplicates. * * @param treeHeight the height of the proof list tree * @return a list of proof entries at each height from 0 to treeHeight; * entries at each level are indexed by their index */ private List<Map<Long, ListProofHashedEntry>> indexHashedEntriesByHeight(int treeHeight) { List<Map<Long, ListProofHashedEntry>> proofByHeight = new ArrayList<>(treeHeight); for (int i = 0; i < treeHeight; i++) { // For single-element proofs, only a single proof node is expected on each level. // For contiguous range proofs, up to two proof nodes are expected on any level. // Multiple-range proofs might have up to 'elements.size' proof nodes on the lowest level, // but Exonum does not currently produce such. int initialCapacity = (elements.size() <= 1) ? 1 : 2; Map<Long, ListProofHashedEntry> proofAtHeight = newHashMapWithExpectedSize(initialCapacity); proofByHeight.add(proofAtHeight); } for (ListProofHashedEntry hashedEntry : proof) { // Check height int height = hashedEntry.getHeight(); if (height < 0 || treeHeight <= height) { throw new InvalidProofException( String.format("Proof entry at invalid height (%d), must be in range [0; %d): %s", height, treeHeight, hashedEntry)); } // Check index long levelSize = levelSizeAt(height); long index = hashedEntry.getIndex(); if (index < 0L || levelSize <= index) { throw new InvalidProofException(String .format( "Proof entry at invalid index (%d); it must be in range [0; %d) at height %d: %s", index, levelSize, height, hashedEntry)); } // Add the entry at the height, checking for duplicates Map<Long, ListProofHashedEntry> proofsAtHeight = proofByHeight.get(height); ListProofHashedEntry present = proofsAtHeight.putIfAbsent(index, hashedEntry); if (present != null) { throw new InvalidProofException( String.format("Multiple proof entries at the same position: %s and %s", present, hashedEntry)); } } return proofByHeight; }
Example 14
Source File: Repositories.java From updatebot with Apache License 2.0 | 4 votes |
protected static void addRepository(Map<String, LocalRepository> map, File gitDir, GitRepository gitRepository) { LocalRepository localRepository = new LocalRepository(gitRepository, new File(gitDir, gitRepository.getName())); map.putIfAbsent(localRepository.getCloneUrl(), localRepository); }
Example 15
Source File: LeaderElection.java From incubator-ratis with Apache License 2.0 | 4 votes |
private ResultAndTerm waitForResults(final long electionTerm, final int submitted, RaftConfiguration conf, Executor voteExecutor) throws InterruptedException { final Timestamp timeout = Timestamp.currentTime().addTimeMs(server.getRandomTimeoutMs()); final Map<RaftPeerId, RequestVoteReplyProto> responses = new HashMap<>(); final List<Exception> exceptions = new ArrayList<>(); int waitForNum = submitted; Collection<RaftPeerId> votedPeers = new ArrayList<>(); while (waitForNum > 0 && shouldRun(electionTerm)) { final TimeDuration waitTime = timeout.elapsedTime().apply(n -> -n); if (waitTime.isNonPositive()) { return logAndReturn(Result.TIMEOUT, responses, exceptions, -1); } try { final Future<RequestVoteReplyProto> future = voteExecutor.poll(waitTime); if (future == null) { continue; // poll timeout, continue to return Result.TIMEOUT } final RequestVoteReplyProto r = future.get(); final RaftPeerId replierId = RaftPeerId.valueOf(r.getServerReply().getReplyId()); final RequestVoteReplyProto previous = responses.putIfAbsent(replierId, r); if (previous != null) { if (LOG.isWarnEnabled()) { LOG.warn("{} received duplicated replies from {}, the 2nd reply is ignored: 1st={}, 2nd={}", this, replierId, ServerProtoUtils.toString(previous), ServerProtoUtils.toString(r)); } continue; } if (r.getShouldShutdown()) { return logAndReturn(Result.SHUTDOWN, responses, exceptions, -1); } if (r.getTerm() > electionTerm) { return logAndReturn(Result.DISCOVERED_A_NEW_TERM, responses, exceptions, r.getTerm()); } if (r.getServerReply().getSuccess()) { votedPeers.add(replierId); if (conf.hasMajority(votedPeers, server.getId())) { return logAndReturn(Result.PASSED, responses, exceptions, -1); } } } catch(ExecutionException e) { LogUtils.infoOrTrace(LOG, () -> this + " got exception when requesting votes", e); exceptions.add(e); } waitForNum--; } // received all the responses return logAndReturn(Result.REJECTED, responses, exceptions, -1); }
Example 16
Source File: FeatureTaskHandler.java From xyz-hub with Apache License 2.0 | 4 votes |
static void preprocessConditionalOp(ConditionalOperation task, Callback<ConditionalOperation> callback) throws Exception { try { task.getEvent().setEnableUUID(task.space.isEnableUUID()); // Ensure that the ID is a string or null and check for duplicate IDs Map<String, Boolean> ids = new HashMap<>(); for (Entry<Feature> entry : task.modifyOp.entries) { final Object objId = entry.input.get(ID); String id = (objId instanceof String || objId instanceof Number) ? String.valueOf(objId) : null; if (task.prefixId != null) { // Generate IDs here, if a prefixId is required. Add the prefix otherwise. id = task.prefixId + ((id == null) ? RandomStringUtils.randomAlphanumeric(16) : id); } entry.input.put(ID, id); if (id != null) { // Minimum length of id should be 1 if (id.length() < 1) { logger.info(task.getMarker(), "Minimum length of object id should be 1."); callback.exception(new HttpException(BAD_REQUEST, "Minimum length of object id should be 1.")); return; } // Test for duplicate IDs if (ids.containsKey(id)) { logger.info(task.getMarker(), "Objects with the same ID {} are included in the request.", id); callback.exception(new HttpException(BAD_REQUEST, "Objects with the same ID " + id + " is included in the request.")); return; } ids.put(id, true); } entry.input.putIfAbsent(TYPE, "Feature"); // bbox is a dynamically calculated property entry.input.remove(BBOX); // Add the XYZ namespace if it is not set yet. entry.input.putIfAbsent(PROPERTIES, new HashMap<String, Object>()); @SuppressWarnings("unchecked") final Map<String, Object> properties = (Map<String, Object>) entry.input.get("properties"); properties.putIfAbsent(XyzNamespace.XYZ_NAMESPACE, new HashMap<String, Object>()); } } catch (Exception e) { logger.error(task.getMarker(), e.getMessage(), e); callback.exception(new HttpException(BAD_REQUEST, "Unable to process the request input.")); return; } callback.call(task); }
Example 17
Source File: AbstractBeanDefinitionParser.java From joyrpc with Apache License 2.0 | 4 votes |
@Override public BeanDefinition parse(final Element element, final ParserContext context) { RootBeanDefinition definition = new RootBeanDefinition(); definition.setBeanClass(beanClass); definition.setLazyInit(false); String id = element.getAttribute("id"); if (requireId) { if (isEmpty(id)) { throw new IllegalConfigureException("spring.bean", id, "do not set", ExceptionCode.COMMON_VALUE_ILLEGAL); } else { if (context.getRegistry().containsBeanDefinition(id)) { throw new IllegalConfigureException("spring.bean", id, "duplicate spring bean id", ExceptionCode.COMMON_VALUE_ILLEGAL); } context.getRegistry().registerBeanDefinition(id, definition); } } //set各个属性值 String methodName; String property; CustomParser parser; List<Method> methods = getPublicMethod(beanClass); Map<String, CustomParser> parserMap = new HashMap<>(methods.size()); for (Method setter : methods) { //略过不是property的方法 if (!isSetter(setter)) { continue; } methodName = setter.getName(); property = methodName.substring(3, 4).toLowerCase() + methodName.substring(4); parser = parsers.get(property); if (parser != null) { parserMap.put(property, parser); } else { Alias alias = setter.getAnnotation(Alias.class); //对象属性对应的xml中的attribute名称 if (alias != null && !StringUtils.isEmpty(alias.value())) { parserMap.put(alias.value(), new AliasParser(property)); } else { //判断是否已经设置了别名 parserMap.putIfAbsent(property, new AliasParser(property)); } } } parserMap.forEach((a, p) -> p.parse(definition, id, element, a, context)); return definition; }
Example 18
Source File: ConnectionAdapterHandler.java From rapidminer-studio with GNU Affero General Public License v3.0 | 3 votes |
/** * Registers a newly created {@link ConnectionAdapter} for the given process and hash if not already present. * * @param process * the process to associate the connection with * @param hash * the hash of the connection * @param adapter * the connection to register * @since 9.6 */ private static synchronized void registerAdapter(Process process, ConnectionCacheHash hash, ConnectionAdapter adapter) { ConnectionCacheByClass typeMap = CONNECTION_CACHE.computeIfAbsent(ProcessTools.getParentProcess(process), p -> { p.addProcessStateListener(CACHE_CLEAN_ON_STOP); return new ConnectionCacheByClass(); }); Map<ConnectionCacheHash, ConnectionAdapter> cachedConnections = typeMap.computeIfAbsent(adapter.getClass(), c -> new HashMap<>()); cachedConnections.putIfAbsent(hash, adapter); }
Example 19
Source File: CfEnvConfigurer.java From spring-cloud-deployer-cloudfoundry with Apache License 2.0 | 2 votes |
/** * Disable Java Buildpack Spring Auto-reconfiguration. * * @param environment a map containing environment variables * @return an copy of the map setting the environment variable needed to disable auto-reconfiguration */ static Map<String, String> disableJavaBuildPackAutoReconfiguration(Map<String, String> environment) { Map<String, String> updatedEnvironment = new HashMap<>(environment); updatedEnvironment.putIfAbsent(JBP_CONFIG_SPRING_AUTO_RECONFIGURATION, ENABLED_FALSE); return updatedEnvironment; }
Example 20
Source File: NodeHandle.java From ongdb-lab-apoc with Apache License 2.0 | 2 votes |
/** * @param * @return * @Description: TODO(对节点集通过ID去重) */ private static <T> Predicate<T> distinctById(Function<? super T, ?> idExtractor) { Map<Object, Boolean> seen = new ConcurrentHashMap<>(); return t -> seen.putIfAbsent(idExtractor.apply(t), Boolean.TRUE) == null; }