ฉันรู้ว่าฉันมาสายเกินไป แต่ฉันต้องการเสนอทางเลือกอื่นไม่ใช่สิ่งที่พิเศษ แต่บางกรณีที่ไม่มีการกล่าวถึงที่นี่ ในกรณีที่มีคนไม่สนใจมากสำหรับประสิทธิภาพ แต่เขาต้องการบางสิ่งบางอย่างด้วยความเรียบง่ายมากขึ้น (อาจจะหาค่ารายการสุดท้ายกับหนึ่งบรรทัดของรหัส) ทั้งหมดนี้จะได้รับการง่ายมากกับการมาถึงของ
Java 8 ฉันให้สถานการณ์ที่เป็นประโยชน์บางอย่าง
เพื่อความสมบูรณ์ฉันเปรียบเทียบทางเลือกเหล่านี้กับโซลูชันของอาร์เรย์ที่ผู้ใช้รายอื่นกล่าวถึงในโพสต์นี้แล้ว ฉันสรุปทุกกรณีและฉันคิดว่ามันจะมีประโยชน์ (เมื่อประสิทธิภาพไม่สำคัญหรือไม่สำคัญ) โดยเฉพาะอย่างยิ่งสำหรับนักพัฒนาใหม่ขึ้นอยู่กับประเด็นของแต่ละปัญหาเสมอ
ทางเลือกอื่นที่เป็นไปได้
การใช้วิธีอาร์เรย์
ฉันเอามันมาจากคำตอบก่อนหน้านี้เพื่อทำการเปรียบเทียบดังต่อไปนี้ โซลูชันนี้เป็นของ @feresr
public static String FindLasstEntryWithArrayMethod() {
return String.valueOf(linkedmap.entrySet().toArray()[linkedmap.size() - 1]);
}
การใช้วิธี ArrayList
คล้ายกับโซลูชันแรกที่มีประสิทธิภาพแตกต่างกันเล็กน้อย
public static String FindLasstEntryWithArrayListMethod() {
List<Entry<Integer, String>> entryList = new ArrayList<Map.Entry<Integer, String>>(linkedmap.entrySet());
return entryList.get(entryList.size() - 1).getValue();
}
ลดวิธีการ
วิธีนี้จะลดชุดขององค์ประกอบจนกว่าจะได้องค์ประกอบสุดท้ายของสตรีม นอกจากนี้จะส่งกลับเฉพาะผลลัพธ์ที่กำหนดเท่านั้น
public static String FindLasstEntryWithReduceMethod() {
return linkedmap.entrySet().stream().reduce((first, second) -> second).orElse(null).getValue();
}
วิธี SkipFunction
วิธีนี้จะได้รับองค์ประกอบสุดท้ายของสตรีมเพียงแค่ข้ามองค์ประกอบทั้งหมดที่อยู่ข้างหน้า
public static String FindLasstEntryWithSkipFunctionMethod() {
final long count = linkedmap.entrySet().stream().count();
return linkedmap.entrySet().stream().skip(count - 1).findFirst().get().getValue();
}
ทางเลือกที่สามารถทำซ้ำได้
Iterables.getLast จาก Google Guava มีการเพิ่มประสิทธิภาพสำหรับ Lists และ SortedSets ด้วย
public static String FindLasstEntryWithGuavaIterable() {
return Iterables.getLast(linkedmap.entrySet()).getValue();
}
นี่คือซอร์สโค้ดแบบเต็ม
import com.google.common.collect.Iterables;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
public class PerformanceTest {
private static long startTime;
private static long endTime;
private static LinkedHashMap<Integer, String> linkedmap;
public static void main(String[] args) {
linkedmap = new LinkedHashMap<Integer, String>();
linkedmap.put(12, "Chaitanya");
linkedmap.put(2, "Rahul");
linkedmap.put(7, "Singh");
linkedmap.put(49, "Ajeet");
linkedmap.put(76, "Anuj");
linkedmap.entrySet().forEach(x -> {});
startTime = System.nanoTime();
FindLasstEntryWithArrayListMethod();
endTime = System.nanoTime();
System.out.println("FindLasstEntryWithArrayListMethod : " + "took " + new BigDecimal((endTime - startTime) / 1000000.000).setScale(3, RoundingMode.CEILING) + " milliseconds");
startTime = System.nanoTime();
FindLasstEntryWithArrayMethod();
endTime = System.nanoTime();
System.out.println("FindLasstEntryWithArrayMethod : " + "took " + new BigDecimal((endTime - startTime) / 1000000.000).setScale(3, RoundingMode.CEILING) + " milliseconds");
startTime = System.nanoTime();
FindLasstEntryWithReduceMethod();
endTime = System.nanoTime();
System.out.println("FindLasstEntryWithReduceMethod : " + "took " + new BigDecimal((endTime - startTime) / 1000000.000).setScale(3, RoundingMode.CEILING) + " milliseconds");
startTime = System.nanoTime();
FindLasstEntryWithSkipFunctionMethod();
endTime = System.nanoTime();
System.out.println("FindLasstEntryWithSkipFunctionMethod : " + "took " + new BigDecimal((endTime - startTime) / 1000000.000).setScale(3, RoundingMode.CEILING) + " milliseconds");
startTime = System.currentTimeMillis();
FindLasstEntryWithGuavaIterable();
endTime = System.currentTimeMillis();
System.out.println("FindLasstEntryWithGuavaIterable : " + "took " + (endTime - startTime) + " milliseconds");
}
public static String FindLasstEntryWithReduceMethod() {
return linkedmap.entrySet().stream().reduce((first, second) -> second).orElse(null).getValue();
}
public static String FindLasstEntryWithSkipFunctionMethod() {
final long count = linkedmap.entrySet().stream().count();
return linkedmap.entrySet().stream().skip(count - 1).findFirst().get().getValue();
}
public static String FindLasstEntryWithGuavaIterable() {
return Iterables.getLast(linkedmap.entrySet()).getValue();
}
public static String FindLasstEntryWithArrayListMethod() {
List<Entry<Integer, String>> entryList = new ArrayList<Map.Entry<Integer, String>>(linkedmap.entrySet());
return entryList.get(entryList.size() - 1).getValue();
}
public static String FindLasstEntryWithArrayMethod() {
return String.valueOf(linkedmap.entrySet().toArray()[linkedmap.size() - 1]);
}
}
นี่คือผลลัพธ์พร้อมประสิทธิภาพของแต่ละวิธี
FindLasstEntryWithArrayListMethod : took 0.162 milliseconds
FindLasstEntryWithArrayMethod : took 0.025 milliseconds
FindLasstEntryWithReduceMethod : took 2.776 milliseconds
FindLasstEntryWithSkipFunctionMethod : took 3.396 milliseconds
FindLasstEntryWithGuavaIterable : took 11 milliseconds