Using Java 8

Default Method

Using Optional
Optional.ofNullable/orElse(T value)/orElseThrow
ifPresent(Consumer consumer)/orElseThrow(XException::new)

Map + ConcurrentHashMap
ConcurrentHashMap<String, Integer> wordMap = new ConcurrentHashMap<String, Integer>(16, 0.9f, 1);

compute, computeIfAbsent, computeIfPresent
the current (existing or computed) value associated with the specified key, or null if the computed value is null
targets.computeIfAbsent(ticket[0], k -> new PriorityQueue()).add(ticket[1]);
counters.computeIfAbsent(name, k -> new AtomicInteger()).incrementAndGet();
map.computeIfAbsent("key", k -> new LongAdder()).increment();

map.putIfAbsent(sum, i);
Instead of:
if (!map.containsKey(sum)) {
    map.put(sum, i);
}

map.getOrDefault(key, defaultValue)
wordMap.merge(word, occurrence, (key, value) -> wordMap.getOrDefault(key, 0) + value);
wordMap.reduceValues(1,(count1,count2) -> count1+count2);
concurrentHashMap.search(threshold, (k, v) -> v > 1000 ? k : null);

Lambda
iterable.forEach(x -> x.setXXX(null));
list.removeIf(s -> s.length() == 0);


list.replaceAll(s -> s.toUpperCase());
list.sort((x, y) -> x.length() – y.length());
Arrays.sort(intervals, (a, b) -> Integer.compare(a.start,b.start));
Arrays.sort(intervals, (a, b) -> a.start - b.start);
logger.finest(() -> complexMsg());
lineCount = Files.lines(path).count();


Collectors
List to map:  
list.stream().collect(Collectors.toMap(x -> x.getId(), x -> x.getName())); - keyMapper, valueMapper
Convert to a different map - TreeMap
.collect(Collectors.toMap(keyMapper, valueMapper,(k,v) ->{ throw new RuntimeException(String.format("Duplicate key %s", k));}, TreeMap::new)); - mergeMapper, mapSupplier

stream().collect(Collectors.groupingBy(xxx));
mapStream.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));

long result=  list.stream().collect(Collectors.counting());

Collectors.joining joins the stream elements for a given delimiter, prefix and suffix. 
String result=  list.stream().collect(Collectors.joining(",","(",")"));

int result = list.stream().collect(Collectors.summingInt(i->i));
Map<String,String> map = streak.collect(Collectors.toMap(k->k, v->v+v));

stream.findFirst().ifPresent(System.out::println); 
streams cannot be reused. The stream is closed after you call any terminal operation.

Word Count:
groupBy aggregate
https://www.javacodegeeks.com/2015/03/jdk-8-streams-and-grouping.html
http://www.nurkiewicz.com/2014/07/grouping-sampling-and-batching-custom.html
Map collect = wordsList.stream().collect(groupingBy(Function.identity(), counting()));

Map map = "abcabc".chars().mapToObj(c -> (char) c).collect(Collectors.groupingBy(c -> c, Collectors.counting()));

Map countMap = Files.lines(file).flatMap(line -> SPLITTER.splitToList(line).stream())
                .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));

Method and Constructor References
XClass::aMethod, XClass::new
list.sort(String::compareToIgnoreCase);
stream.forEach(System.out::println)

Stream
List to map:
list.stream().collect( Collectors.toMap(Perseon::getId, Perseon::getAge));
toString

flatMap
Combination of map and flatten. The parameter mapper function returns a list of stream, flatMap flatten them into a Stream of single value.
slices.stream().map(slice -> slice.getReplicas()).flatMap(replicas -> replicas.stream())

    .map(replica -> replica.getCoreUrl()).collect(Collectors.toList())

ArrayList.toString() 
ArrayList class extends AbstractList class, which extends AbstractCollection class which contains a toString() method

String.join(", ", list);

Troubleshooting
When compiler complains: incompatible types: cannot infer type-variable(s),try to declare an explicit type to provide enough type information to compiler: 
Map<K1, V1> to Map<K2, V2>
new HashMap<String, ValueClass>().entrySet().stream().collect(Collectors.toMap((final Entry<String, ValueClass> e) -> LocalDate.parse(e.getKey()), e -> e.getValue()));

Java 8 Time API
LocalDate/LocalTime/LocalDateTime - no time zone, good for store birthday
ZonedDateTime
date1.until(date2, ChronoUnit.DAYS),
date1.plusDays(1)

DateTimeFormatter - thread safe
-- Prefer it than SimpleDateFormat

LocalDate.parse("2016-10-06")
LocalDateTime.parse("2016-10-06", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"))


SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));

Convert Date to ZonedDateTime
ZonedDateTime.ofInstant(date.toInstant(), ZoneOffset.UTC)

Month Enum
LongAdder vs AtomicLong

Related
Java Tips, Tricks and Traps
Post a Comment

Labels

Java (159) Lucene-Solr (112) Interview (61) All (58) J2SE (53) Algorithm (45) Soft Skills (38) Eclipse (33) Code Example (31) Linux (25) JavaScript (23) Spring (22) Windows (22) Web Development (20) Tools (19) Nutch2 (18) Bugs (17) Debug (16) Defects (14) Text Mining (14) J2EE (13) Network (13) Troubleshooting (13) PowerShell (11) Chrome (9) Design (9) How to (9) Learning code (9) Performance (9) Problem Solving (9) UIMA (9) html (9) Http Client (8) Maven (8) Security (8) bat (8) blogger (8) Big Data (7) Continuous Integration (7) Google (7) Guava (7) JSON (7) Shell (7) ANT (6) Coding Skills (6) Database (6) Lesson Learned (6) Programmer Skills (6) Scala (6) Tips (6) css (6) Algorithm Series (5) Cache (5) Dynamic Languages (5) IDE (5) System Design (5) adsense (5) xml (5) AIX (4) Code Quality (4) GAE (4) Git (4) Good Programming Practices (4) Jackson (4) Memory Usage (4) Miscs (4) OpenNLP (4) Project Managment (4) Spark (4) Testing (4) ads (4) regular-expression (4) Android (3) Apache Spark (3) Become a Better You (3) Concurrency (3) Eclipse RCP (3) English (3) Happy Hacking (3) IBM (3) J2SE Knowledge Series (3) JAX-RS (3) Jetty (3) Restful Web Service (3) Script (3) regex (3) seo (3) .Net (2) Android Studio (2) Apache (2) Apache Procrun (2) Architecture (2) Batch (2) Bit Operation (2) Build (2) Building Scalable Web Sites (2) C# (2) C/C++ (2) CSV (2) Career (2) Cassandra (2) Distributed (2) Fiddler (2) Firefox (2) Google Drive (2) Gson (2) How to Interview (2) Html Parser (2) Http (2) Image Tools (2) JQuery (2) Jersey (2) LDAP (2) Life (2) Logging (2) Python (2) Software Issues (2) Storage (2) Text Search (2) xml parser (2) AOP (1) Application Design (1) AspectJ (1) Chrome DevTools (1) Cloud (1) Codility (1) Data Mining (1) Data Structure (1) ExceptionUtils (1) Exif (1) Feature Request (1) FindBugs (1) Greasemonkey (1) HTML5 (1) Httpd (1) I18N (1) IBM Java Thread Dump Analyzer (1) JDK Source Code (1) JDK8 (1) JMX (1) Lazy Developer (1) Mac (1) Machine Learning (1) Mobile (1) My Plan for 2010 (1) Netbeans (1) Notes (1) Operating System (1) Perl (1) Problems (1) Product Architecture (1) Programming Life (1) Quality (1) Redhat (1) Redis (1) Review (1) RxJava (1) Solutions logs (1) Team Management (1) Thread Dump Analyzer (1) Visualization (1) boilerpipe (1) htm (1) ongoing (1) procrun (1) rss (1)

Popular Posts