INT-3528 Use Collections min and max methods where appropriate

JIRA: https://jira.spring.io/browse/INT-3528

Use `min` and `max` methods instead of sorting an entire collection to get the minimum or maximum element.

Change other inline `Comparator<?>`s to the `final` fields
This commit is contained in:
Enrique Rodríguez
2014-10-11 15:37:06 -02:00
committed by Artem Bilan
parent 252c53db4c
commit 6f7a8e3002
5 changed files with 27 additions and 23 deletions

View File

@@ -13,9 +13,9 @@
package org.springframework.integration.aggregator;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
@@ -81,6 +81,7 @@ import org.springframework.util.CollectionUtils;
* @author Gary Russell
* @author Artem Bilan
* @author David Liu
* @author Enrique Rodríguez
* @since 2.0
*/
public abstract class AbstractCorrelatingMessageHandler extends AbstractMessageProducingHandler
@@ -90,6 +91,8 @@ public abstract class AbstractCorrelatingMessageHandler extends AbstractMessageP
public static final long DEFAULT_SEND_TIMEOUT = 1000L;
private final Comparator<Message<?>> sequenceNumberComparator = new SequenceNumberComparator();
private final Map<UUID, ScheduledFuture<?>> expireGroupScheduledFutures = new HashMap<UUID, ScheduledFuture<?>>();
protected volatile MessageGroupStore messageStore;
@@ -588,11 +591,7 @@ public abstract class AbstractCorrelatingMessageHandler extends AbstractMessageP
}
protected int findLastReleasedSequenceNumber(Object groupId, Collection<Message<?>> partialSequence) {
List<Message<?>> sorted = new ArrayList<Message<?>>(partialSequence);
Collections.sort(sorted, new SequenceNumberComparator());
Message<?> lastReleasedMessage = sorted.get(partialSequence.size() - 1);
Message<?> lastReleasedMessage = Collections.max(partialSequence, this.sequenceNumberComparator);
return new IntegrationMessageHeaderAccessor(lastReleasedMessage).getSequenceNumber();
}

View File

@@ -16,11 +16,9 @@
package org.springframework.integration.aggregator;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -38,12 +36,13 @@ import org.springframework.messaging.Message;
* @author Dave Syer
* @author Iwein Fuld
* @author Oleg Zhurakousky
* @author Enrique Rodríguez
*/
public class SequenceSizeReleaseStrategy implements ReleaseStrategy {
private static final Log logger = LogFactory.getLog(SequenceSizeReleaseStrategy.class);
private volatile Comparator<Message<?>> comparator = new SequenceNumberComparator();
private final Comparator<Message<?>> comparator = new SequenceNumberComparator();
private volatile boolean releasePartialSequences;
@@ -77,10 +76,9 @@ public class SequenceSizeReleaseStrategy implements ReleaseStrategy {
if (logger.isTraceEnabled()) {
logger.trace("Considering partial release of group [" + messageGroup + "]");
}
List<Message<?>> sorted = new ArrayList<Message<?>>(messages);
Collections.sort(sorted, comparator);
Message<?> minMessage = Collections.min(messages, this.comparator);
int nextSequenceNumber = new IntegrationMessageHeaderAccessor(sorted.get(0)).getSequenceNumber();
int nextSequenceNumber = new IntegrationMessageHeaderAccessor(minMessage).getSequenceNumber();
int lastReleasedMessageSequence = messageGroup.getLastReleasedMessageSequenceNumber();
if (nextSequenceNumber - lastReleasedMessageSequence == 1){

View File

@@ -17,6 +17,7 @@
package org.springframework.integration.channel;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
@@ -50,12 +51,14 @@ import org.springframework.util.StringUtils;
public abstract class AbstractMessageChannel extends IntegrationObjectSupport
implements MessageChannel, TrackableComponent, ChannelInterceptorAware {
private final ChannelInterceptorList interceptors = new ChannelInterceptorList();
private final Comparator<Object> orderComparator = new OrderComparator();
private volatile boolean shouldTrack = false;
private volatile Class<?>[] datatypes = new Class<?>[0];
private final ChannelInterceptorList interceptors = new ChannelInterceptorList();
private volatile String fullChannelName;
private volatile MessageConverter messageConverter;
@@ -96,7 +99,7 @@ public abstract class AbstractMessageChannel extends IntegrationObjectSupport
*/
@Override
public void setInterceptors(List<ChannelInterceptor> interceptors) {
Collections.sort(interceptors, new OrderComparator());
Collections.sort(interceptors, this.orderComparator);
this.interceptors.set(interceptors);
}

View File

@@ -153,7 +153,7 @@ final class GlobalChannelInterceptorProcessor implements BeanFactoryAware, Smart
tempInterceptors.add(globalChannelInterceptorWrapper);
}
}
Collections.sort(tempInterceptors, comparator);
Collections.sort(tempInterceptors, this.comparator);
if (!tempInterceptors.isEmpty()) {
for (int i = tempInterceptors.size() - 1; i >= 0; i--) {
ChannelInterceptor channelInterceptor = tempInterceptors.get(i).getChannelInterceptor();

View File

@@ -13,6 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.integration.redis.store;
import java.util.Collections;
@@ -45,6 +46,15 @@ import org.springframework.util.Assert;
*/
public class RedisChannelPriorityMessageStore extends RedisChannelMessageStore implements PriorityCapableChannelMessageStore {
private final Comparator<String> keysComparator = new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
return s2.compareTo(s1);
}
};
public RedisChannelPriorityMessageStore(RedisConnectionFactory connectionFactory) {
super(connectionFactory);
}
@@ -111,13 +121,7 @@ public class RedisChannelPriorityMessageStore extends RedisChannelMessageStore i
Assert.isInstanceOf(String.class, key);
list.add((String) key);
}
Collections.sort(list, new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
return s2.compareTo(s1);
}
});
Collections.sort(list, this.keysComparator);
return list;
}