Tagir ValeevïŒ
lany ïŒãšBaruch SadogurskyïŒ
jbaruch ïŒã¯ãJavaããºã«ã®æ°ããã³ã¬ã¯ã·ã§ã³ãäœæããæ¥ãã§ããããå
±æããŠããŸãã
ãã®èšäºã¯ãç§ã®äŒè°JPoint 2017ã§ã®ã¹ããŒãã®ãã³ãŒãã«åºã¥ããŠããŸããJava8ã®å°å¹³ç·ã§Java 8ãšãããããŠè¿«ãæ¥ãè¬ãããã€ãããã瀺ããŠããŸããç§ãã¡ãæ··ä¹±ãããããã«ã
圌ãã話ããŠããããšã¯ãã¹ãŠãããããææ°ããŒãžã§ã³ã®Java 8ããã³9ã§åäœããã¯ãã§ãã ç§ãã¡ã¯ãã§ãã¯ããŸãã-ãã¹ãŠãæ£çŽã§ããããã§ãïŒãããæžãããŠããããã«ãããã¯ãããã©ã®ããã«åäœãããã§ãã
念ã®ããã«ãèè
ã«ã€ããŠã®ããã€ãã®èšèã¯ãããªããæ¢ã«ããç¥ã£ãŠãããšæããŸãããBaruchã¯JFrogã§Developer Relationsã«åŸäºããŠãããTagirã¯IntelliJ IDEAéçºè
ã§ãããStreamExã©ã€ãã©ãªã®äœæè
ã§ãã
Javaããºã«ã®çªå·1ïŒéè¡ãé£ã³è¶ããæ¹æ³
ãŠã©ãŒã ã¢ããããããã«ãæåã®è¬è§£ããæ±ããŸããæªç¥ã®ã¢ã¡ãªã«ã®ããã«ãŒãéè¡ãé£ã³è¶ããããšããŠããŸãã

åºæ¬çã«ãéè¡ã®ããžãã¯ãJava Semaphoreã«ãããã³ã°ããŠããŸãã Semaphoreã³ã³ã¹ãã©ã¯ã¿ãŒã«ã¯ãåæãã©ã³ã¹ããããŸãã -42ãªãŒããŒãã©ããããéå§ããã»ããã©ã¡ãœãããéè¡ååŒã¡ãœããã«ãããã³ã°ããŸãã ã€ãŸãã
drainPermits
ããã¯ãéè¡ãããã¹ãŠã®ãéãåããããš
availablePermits
ãã
availablePermits
ãæ®é«ã確èªãããããšã§ãã
public class PerfectRobbery { private Semaphore bankAccount = new Semaphore(-42); public static void main(String[] args) { PerfectRobbery perfectRobbery = new PerfectRobbery(); perfectRobbery.takeAllMoney(); perfectRobbery.checkBalance(); } public void takeAllMoney(){ bankAccount.drainPermits(); } public void checkBalance(){ System.out.println(bankAccount.availablePermits()); } }
ãããŠãããã€ãã®ããžãã¯ããããŸãã
PerfectRobbery
ã¯ã©ã¹ã§
PerfectRobbery
ãªããžã§ã¯ããäœæãã2ã€ã®ã¡ãœãããåŒã³åºããŸããéè¡ãããã¹ãŠã®ãéãåéããå®éã«ãã¹ãŠã®ãéãåãåã£ãããšã確èªããŸãã
è² ã®åæå€ã§ã»ããã©ãäœæããã«ã¯ã©ãããã°ããã§ããïŒ ããã¯æåã®çããªã®ã§ãçŽ æŽããã質åã§ãã ãããŠã圌ã®ã»ãã«ãããã«3ã€ãããŸãã
A.
IllegalArgumentException
è² ã®ãã©ã³ã¹ã®ã»ããã©ãäœæã§ããŸããã
B.
UnsupportedOperationException
è² ã®ãã©ã³ã¹ã®ã»ããã©ãäœæã§ããŸããããã®äžã§drainPermitsãåŒã³åºãããšã¯ã§ããŸããã
C. 0-ãã€ãã¹ã®æ®é«ã®
drainPermits
ã¯èš±å¯ããŒãã®ãŸãŸã«ããŸãã
D.
drainPermits
ãã€ãã¹ã®ãã©ã³ã¹ãæã€
drainPermits
ã¯ãæåºãããã®ããªããããå
ã®ãŸãŸã«ãªããŸãã
èŽè¡ã®æç¥šã§ã¯ã倧åããªãã·ã§ã³Dã§ãããæ£è§£ã¯Cã§ããããšã瀺ãããŸããã
Javaã®ããã¥ã¡ã³ãã§ã¯ãã»ããã©ãè² ã®å€ããšãããšãã§ãããšããèšè¿°ãèŠã€ããããšãã§ããŸãã ããã«ã
drainPermits
ã¯äœ¿çšå¯èœãªãã¹ãŠã®èš±å¯ãè¿ããŸãã

-42ããŒããããããå Žåãã©ããããå©çšã§ããŸããïŒ 0ãå©çšå¯èœã§ãããããSergey Kursenkoããã°ããªãŒãã³ããæ¬¡ã®ããã«èšããŸããã -42ã§å©çšå¯èœãªèš±å¯ããã¬ãŒã³ãããšãå©çšå¯èœãªèš±å¯0ãããããã-42ã®ãŸãŸã«ãªããŸãã-42ãã0ãããŒãžãããšã-42ã«ãªããŸãã

ããããããã«ãã£ãã®ã¯ãDoug Leeãã³ã¡ã³ãã«åå ããŠèšã£ãããã§ãã ãã®ãããJavadocã«è¡ã远å ããŠãä¿®æ£ãããŸãã

Java PuzzlerïŒ2ïŒã·ã³ã°ã«ããŒã³
ããã«é²ã¿ãŸãããã ç§ãã¡ããã®ã¡ãã£ãšãããã³ãïŒã·ã³ã°ã«ããŒã³ãäœæããªãã§ãã ãããã·ã³ã°ã«ããŒã³ã飲ãããšããå§ãããŸãã

Java 7ãèŠãŠã¿ãŸããã
emptyList
ã䜿çšããŠç©ºã®ãªã¹ããäœæãã
emptyList
ã䜿çšããŠç©ºã®ã€ãã¬ãŒã¿ãŒãäœæã§ããŸãã
Collections.emptyList() == Collections.emptyList(); Collections.emptyIterator() == Collections.emptyIterator();
ãããŠè³ªåã¯ïŒåœŒãã¯ã·ã³ã°ã«ãã³ã§ããïŒ åžžã«åããªããžã§ã¯ããè¿ããŸããïŒ 4ã€ã®å¯èœãªçãããããŸãã
A. true / true-åžžã«æ»ããŸãã
B. true / false-ã·ã³ã°ã«ãã³-ãªã¹ãã®ã¿ãå埩åã¯æ¯åç°ãªããŸãã
C. false / true-ã€ãã¬ãŒã¿ãŒ-ã·ã³ã°ã«ãã³ãæ°ãããªã¹ããæ¯åäœæãããŸãã
D. false / false-ãããã¯ã·ã³ã°ã«ããŒã³ã§ã¯ãããŸããã
èŽè¡ã®æç¥šã§ã¯ã倧åããªãã·ã§ã³Bã§ãããæ£è§£ã¯Aã§ããããšã瀺ãããŸãããããã§è³ªåãå§ãŸããŸãã ããºã©ãŒãæ¬¡ã«æ¥ãŸãã
Java 8ã«é²ã¿ãŸãããã空ã®ãªããžã§ã¯ããè¿ãæ°ããã¡ãœãããã¹ããªãã¿ãŒãšã¹ããªãŒã ããããŸãã
Spliterators.emptySpliterator() == Spliterators.emptySpliterator(); Stream.empty() == Stream.empty();
ãããŠã圌ãã®ããã«è³ªåãç¹°ãè¿ããŸãããïŒ
A. true / true
B. true / false
C. false / true
D. false / false
èŽè¡ã®æç¥šã§ã¯ã倧åããªãã·ã§ã³Dã§ãããæ£è§£ã¯Bã§ããããšã瀺ãããŸãããç¶æ
ããªããããã¹ããªãã¿ãŒã¯ã·ã³ã°ã«ãã³ã«ãªããŸãã空ã®ã¹ããªãã¿ãŒãäœåããã€ãã¹ããããšããããšãã§ããŸãã ãã ããã¹ããªãŒã ã«ã¯ç¶æ
ããããå°ãªããšã2ã€ã®èŠçŽ ã§æ§æãããŠããŸããæåã«ãã¹ããªãŒã ã«
closeHandler
ããã³ã°ãããããšãã§ããŸãã ãããã·ã³ã°ã«ãã³ã§ããå Žåãããå Žæã§1ã€ã®ãã³ãã©ãŒããå¥ã®å Žæã§å¥ã®ãã³ãã©ãŒãæãããã®åŸäœãèµ·ãããããããªãããšãæ³åããŠãã ããã ãã¡ããããã¹ãŠã®ç©ºã®ã¹ããªãŒã ã¯ãç¬ç«ããããªãŒã§ããå¿
èŠããããŸãã 第äºã«ãã¹ããªãŒã ã¯äžåºŠã ã䜿çšããå¿
èŠããããŸãã ã¹ããªãŒã ãåå©çšãããå Žåããããæ€åºããŠ
IllegalStateException
ãã¹ããŒããŸãã

Java PuzzlerïŒ3ïŒåããªã¹ã
次ã®ããºã«ã§ã¯ãããå¥åŠãªæå³ã§ãåäžããšããèšèã䜿çšããŸãã åäž-ãããã¯ãå
éšæ§é ã«é¢ããŠåãã§ãã ããã¯ãããããçããããŸãã¯åãããã·ã¥ã³ãŒããæã€ããšãæå³ãããã®ã§ã¯ãªããåç
§ã®ãã§ãã¯ã«é¢é£ããŠããããšãæå³ãããã®ã§ããããŸããã
2ã€ã®ãªã¹ãã®é
åãäœæããŸãã Java 8ã§ã¯
setAll
ã¡ãœãããå°å
¥ããããããããã«ãã¹ãŠãåããããšãã§ããŸãã
ArrayList
ã³ã³ã¹ãã©ã¯ã¿ã§åããŸãã 2ã€ã®ãªã¹ãã§æ§æãããé
åãååŸããŸãã
List[] twins = new List[2]; Arrays.setAll(twins, ArrayList::new);
質åïŒã©ã®ãªã¹ãããããŸããïŒ åçãªãã·ã§ã³ïŒ
A.åäžã®ç©ºã®ãªã¹ã
B.åäžã®ç©ºã§ãªããªã¹ã
C.åã空ã®ãªã¹ãã§ã¯ãªã
D.åãã§ã¯ãªã空ã®ãªã¹ã
èŽè¡ã®æç¥šã§ã¯ã倧åããªãã·ã§ã³Aã§ãããæ£è§£ã¯Cã§ããããšã瀺ãããŸããã
æåã«ã
setAll
ã¯
supplier
åãå
¥ããã
inputInt Function
åãå
¥ããŸã
inputInt Function
ã«ã¯ãé
åã€ã³ããã¯ã¹ãæž¡ãããããã«å¿ããŠãã®é
åã€ã³ããã¯ã¹ãåŒæ°ãšããŠæž¡ãããŸãã 空ã®åŒæ°ããã§ã¯ãªããinitialCapacityãã
ArrayList
ã³ã³ã¹ãã©ã¯ã¿ãŒã«èªåçã«ãããã³ã°ããŸãã ã€ãŸããããã§éä¿¡ããããã®ã€ã³ããã¯ã¹ã¯ã©ãã«ãç»é²ãããã衚瀺ãããŸããã ããã¯Groovyã®äžéšã§ããç§ãã¡ã¯äœããæžããŠãããäœããããŠããã®ã§ãããäœãç¥ã£ãŠããã®ãããããŸããã

ãšããã§ãããã®ãããã§
OutOfMemory
é£ã¶ããšãã§ããŸãã 10äžã®é
åãäœæããå Žåããªã¹ãã«ã¯10ââäžã®äºåå®çŸ©ãããé
åãå«ãŸããŸãã
Java Puzzler No.4ïŒåäžã®æœè±¡ã¡ãœãã
æ©èœçãªã€ã³ã¿ãŒãã§ãŒã¹ãäœæããŠã¿ãŸãããã ãŸããã€ã³ã¿ãŒãã§ã€ã¹ãäœæããŸããã4ã€ã®ã¡ãœããã远å ããŸãããã®ãã¡3ã€ã¯æœè±¡çã§ãã ãããŠãããããå¥ã®ã€ã³ã¿ãŒãã§ã€ã¹ãç¶æ¿ããæ©èœçã«ããŸãã ã³ã³ãã€ã«ããŸããïŒ
public interface <T> { default void (String ) { System.out.println(); } void (T songName); void (T ); void (String ); } @FunctionalInterface public interface extends <String> { }
çãã¯æ¬¡ã®ãšããã§ãã
A.äžäœäœïŒïŒ ãã·ã³ã°ã«ããšã¯ã3ã€ã§ã¯ãªã1ã€ã®ã¡ãœãããæå³ããŸãïŒ
B.
(T)
ã¡ãœããã®åé¡
(T)
ãåé€ããŠãåé¡ã¯ãã
(T)
C.
ã
ããæ¹æ³ã«åé¡ããã
倧äžå€«ã§ãã
D.æåŸãŸã§ïŒ éè€ã厩å£ãã
ã
ããã«æ®ãããŸãã
èŽè¡ã®æç¥šã§ã¯ã倧åããªãã·ã§ã³Dã§ãããæ£è§£ã¯Bã§ããããšã瀺ãããŸãããå®éãå®è£
ãããŠããªãã¡ãœããïŒ
ïŒã¯ããã©ã«ãã®å®è£
ã«ãã£ãŠãããã¯ãããŠããããã³ã³ãã€ã©ã¯äœ¿çšãããã®ã決å®ã§ããŸããã ããã¯ããã¥ã¡ã³ãã«æžãããŠããŸããã€ã³ã¿ãŒãã§ã€ã¹ããããªãŒããŒã©ã€ããšåçã®ã·ã°ããã£ãæã€ããã€ãã®æœè±¡ã¡ãœãããç¶æ¿ã§ããŸãã Tãæååã§ãããšå€æãããšãã2ã€ã®ã¡ãœããã¯åŽ©å£ããŸããã ããããã€ã³ã¿ãŒãã§ã€ã¹ãããã©ã«ãã®ã¡ãœãããç¶æ¿ãããã®ã·ã°ããã£ãæœè±¡ã¡ãœãããšåçã®ãªãŒããŒã©ã€ãã§ããå ŽåããããŸãããçãããããããã¯ã³ã³ãã€ã«ãšã©ãŒã§ããããã©ã«ãã®å®è£
ã䜿çšãããã©ããã
Javaèšèªä»æ§ã®ã¹ã¯ãªãŒã³ã·ã§ããJavaããºã«çªå·5ïŒéè¡ããããã³ã°ããæ¹æ³ã 第äºç
ãã¹ãŠã®éè¡ãœãããŠã§ã¢ã¯Javaã§æžãããŠããŸãã Alfa Bankã¯JavaãDeutsche Bankã¯JavaãSberbankã¯Javaã§ãã ãã¹ãŠã®éè¡ã¯Javaã§èšè¿°ããŸããããã¯Javaã®æ»æãæå³ããå€ãã®ããŒã«ãããããããã³ã°ã容æã§ããã®åŸæå€§ã®å£åº§ãèŠã€ããŠãããããéãåŒãåºããŸãã
Set<String> accounts = new HashSet<>(Arrays.asList("Gates", "Buffett", "Bezos", "Zuckerberg")); System.out.println("accounts= " + accounts);
ãããããŸãšããŠå°å·ããŸãããã ç§ãã¡ãããããæã«å
¥ããã®ãšåãé åºã§èŠãã®ã ãããïŒ
A.åºåã®é åºã¯ç¶æãããŸã
B.é åºã¯äžæã§ãããå®è¡ã®éã«æ®ããŸã
C.é åºã¯äžæã§ãJVMãåèµ·åãããã³ã«å€ãããŸã
D.é åºã¯äžæã§ãå°å·ããšã«å€ãããŸãã
èŽè¡ã®æç¥šã§ã¯ã倧åããªãã·ã§ã³Bã®ãã®ã§ããããããæ£è§£ã§ããããšã瀺ãããŸããã ããã·ã¥ã®å
éšãããã·ã¥ã§ãããããã·ã¥ã«ã¯ããŒãããããšã¯èª°ããç¥ã£ãŠããŸãã

ããã«ã¯äœãé¢ä¿ããããŸãïŒ ãã®ãããã¢ãŒãªãŒã¢ã¯ã»ã¹ãªãªãŒã¹Java 9ã«åãæ¿ããŠããŸãïŒéè¡ã¯åžžã«ãããè¡ããææ°ã®ãã®ããã¹ãŠäœ¿çšããŸãïŒã
Set.of
ã¡ãœããã
Set.of
ã«è¡šç€ºããããããããã§ãã¹ãŠãããè峿·±ããã®ã«ãªã
Set.of
ããã®ããããã®é·ããã¹ãŠã®ä»£ããã«ãç°¡åã«æžãããšãã§ããŸãã
Set<String> accounts = Set.of("Gates", "Buffett", "Bezos", "Zuckerberg"); System.out.println("accounts= " + accounts);
質åã¯åããŸãŸã§ããã»ããã«å
¥ããŠå°å·ãããšãã¢ã«ãŠã³ããååŸããã®ãšåãé åºã§è¡šç€ºãããŸããïŒ
A.åºåã®é åºã¯ç¶æãããŸã
B.é åºã¯äžæã§ãããå®è¡ã®éã«æ®ããŸã
C.é åºã¯äžæã§ãJVMãåèµ·åãããã³ã«å€ãããŸã
D.é åºã¯äžæã§ãå°å·ããšã«å€ãããŸãã
èŽè¡ã®æç¥šã§ã¯ã倧åããªãã·ã§ã³Cã§ããããããæ£è§£ã§ããããšã瀺ãããŸããã 蚌æ ããããŸãã 9çªç®ã®Javaã«ç»å Žãã
JShell
ãšåŒã°ããæ°ããçŽ æŽããããã®ãå©çšã§ããŸãã ãã®ã³ãŒããè©°ã蟌ã¿ãäœããã®é åºãååŸããç¹°ãè¿ããç°ãªãé åºãååŸããç¹°ãè¿ãã3çªç®ã®é åºãååŸããŸãã ã©ã®ããã«æ©èœããŸããïŒ

ããã¯æå³çã«è¡ãããŸãã ããã¯ãåã
Set.of
ããã·ã¥ã³ãŒãã«ãã£ãŠããŒãã«èŠçŽ ãèšç®ãããæ¹æ³
Set.of
ã
private int probe(Object pe) { int idx = Math.floorMod(pe.hashCode() ^ SALT, elements.length); while (true) { E ee = elements[idx]; if (ee == null) { return -idx - 1; } else if (pe.equals(ee)) { return idx; } else if (++idx == elements.length) { idx = 0; } } }
ããã·ã¥ã³ãŒã
^ SALT
ããããSALTã¯JVMã®èµ·åæã«ä¹±æ°ã§åæåãããéçãã£ãŒã«ãã§ãã ããã¯æå³çã«è¡ãããŸããããªããªããããã·ã¥ã»ããã®é åºãå®çŸ©ãããŠããªããšããããã³çœé»ã®ããã¥ã¡ã³ãããããã®äžã«çœ®ããªãã§ããšæžãããšãã«ãããŸãã«ãå€ãã®äººãããã·ã¥ã»ããã®é åºã決ããããã§ãã ãããã£ãŠãéå§ããããšãããšãã«JVMãåèµ·åããã ãã§ãããã¯æ©èœããªããªããŸãã ããªãã¯ãããæã«å
¥ããããšãã§ããŸããã å±éºã¯ãããŸããããã®ããšã¯å¶ç¶ã«æ©èœãããšèãã人ãããŸãã
Java PuzzlerïŒ6ïŒãžã°ãœãŒããºã«
Jigsaw
ã«é¢ããããã€ãã®å£°æããããŸãã ã©ã¡ããæ£ããããæšæž¬ããŠã¿ãŠãã ããã
A.ãžã°ãœãŒããºã«ã¢ããªã±ãŒã·ã§ã³ãã¢ãžã¥ãŒã«ã«ãããšã
classpath
äŸåé¢ä¿ãæ£ããèªã¿èŸŒãŸããŸã
B.äŸåé¢ä¿ã®1ã€ããžã°ãœãŒã¢ãžã¥ãŒã«ã§ããå Žåã¯ã
module-info
ãã¡ã€ã«ãç»é²ããŠ
module-info
C. module-infoãã¡ã€ã«ãç»é²ããå Žåããã¹ãŠã®äŸåé¢ä¿ã
classpath
ãš
module-info
2åæžã蟌ã
classpath
ãã
module-info
D.äœãçå®ã§ã¯ãªã
æ£è§£ã¯Cã§ãããã¡ããããã¹ãŠã2ååŠæ¹ããå¿
èŠããããŸãã è¯ããã¥ãŒã¹ã¯ã
Gradle
ãš
Maven
ããããã®ã³ã³ããŒãã³ãïŒæ£ãã
classpath
ãšæ£ãã
module-info
ïŒã®äž¡æ¹ãçæããããšã§ãããããã£ãŠããã³ã§ãããè¡ãå¿
èŠã¯ãããŸããã ãã ãããããã®ããŒã«ã䜿çšããªãå Žåã¯ã埮åŠãªéãã¯ãããŸããã2åå®è¡ããå¿
èŠããããŸãã
module-path
ãã©ã°ã䜿çšã§ããŸããããã«ã¯ç¬èªã®ããºã«æ©èœããããŸãããæ¬¡åã¯ããã«ã€ããŠã§ãã
Java PuzzlerïŒ7ïŒãšã¯ã¹ãã³ããã«ãº2
The Expendablesã®ã³ã¬ã¯ã·ã§ã³ãããããããããã¹ãŠç Žå£ããããšèããŠããŸãã ãã®ããã«ç Žæ£ããŸããã€ãã¬ãŒã¿ãååŸãããã®
forEachRemaining
ã¡ãœãããåŒã³åºããŸãã ãããŠãåèŠçŽ ã«å¯ŸããŠãã®ãããªããšãè¡ããŸããæ¬¡ã®ã¬ã³ãŒããããå Žåãç§»åããŠç Žæ£ããŸãïŒããã¯ãã¹ãŠ
forEachRemaining
å
ã«ãã
forEachRemaining
ïŒã
static void killThemAll(Collection<Hero> expendables) { Iterator<Hero> heroes = expendables.iterator(); heroes.forEachRemaining(e -> { if (heroes.hasNext()) { heroes.next(); heroes.remove(); } }); System.out.println(expendables); }
ãªãã·ã§ã³ã¯äœã§ããïŒ
A.ã¿ããªæ»ãã
B.å¶æ°äººã ããæ»ãã
C.å
šå¡ãçãæ®ã£ã
D.奿°ã®ã¿ãæ»äº¡ãã
E.ãã¹ãŠã®çãã¯æ£ããã§ãã
æ£è§£ã¯Eã§ããããã¯æªå®çŸ©ã®åäœã§ãã ããã§ãç°ãªãã³ã¬ã¯ã·ã§ã³ãéä¿¡ããããšãã§ããŸãããããå®è¡ããããšãããšãç°ãªãçµæãåŸãããŸãã
ããã§
ArrayList
ãæå®ãããšãå
šå¡ãæ»äº¡ããŠããããšãããããŸãã
killThemAll(new ArrayList<String>(Arrays.asList("N","S","W","S","L","S","L","V"))); []< /source> <code>LinkedList</code>, , <source lang="java">killThemAll(new LinkedList<String>(Arrays.asList("N","S","W","S","L","S","L","V"))); [S,S,S,V]
ããã§
ArrayDeque
ãæäŸããå Žåãå
šå¡ãçåããäŸå€ã¯ãããŸããã
killThemAll(new ArrayDeque<String>(Arrays.asList("N","S","W","S","L","S","L","V"))); [N,S,W,S,L,S,L,V]
ãããŠãããã§
TreeSet
ãããšãå察ã«ãå¥åŠãªãã®ãæ»ã«ãŸãã
killThemAll(new TreeSet<String>(Arrays.asList("N","S","W","S","L","S","L","V"))); [N,W,L,L]
ãããã£ãŠã決ããŠïŒ 絶察ã«ããªãã§ãã ããïŒ å®éãããã¯å¶ç¶ã«èµ·ãããŸãã-誰ãããããããã ãããšèª°ãèããªãã£ãããã§ãã ãããOracleã«å ±åãããšãã圌ãã¯äœãããŸãããïŒ ããã§ããããã¥ã¡ã³ãã«ããã«ã€ããŠæžãããšã§ããã®åé¡ãä¿®æ£ããŸãããïŒ

Java PuzzlerïŒ8ïŒåŸ®åŠãªéã
ãªãªãžãã«ã®æ¬ç©ã®ã¢ãã£ãã¹ãããããæ¬åœã«ã¢ãã£ãã¹ã§ããããšãæ€èšŒããè¿°èªã®åœ¢ã§äœæããããšæããŸãã æ©èœçãªã€ã³ã¿ãŒãã§ãŒã¹ãäœæãããããäœããã®Tåã§ãã©ã¡ãŒã¿ãŒåããããã«å¿ããŠLambdaã®åœ¢åŒãŸãã¯
methodRef
ã®åœ¢åŒã§
methodRef
ãŸãã
@FunctionalInterface public interface OriginalPredicate<T> { boolean test(T t); } OriginalPredicate<Object> lambda = (Object obj) -> "adidas".equals(obj); OriginalPredicate<Object> methodRef = "adidas"::equals;
質åïŒããã¯ãã¹ãŠã³ã³ãã€ã«ãããŠããŸããïŒ
A.äž¡æ¹ãã³ã³ãã€ã«ãããŸã
B. Lambdaã³ã³ãã€ã«ãã¡ãœãããªãã¡ã¬ã³ã¹-ããã
C.ã¡ãœããåç
§ã¯ã³ã³ãã€ã«ãããŸãããã©ã ãã¯ã³ã³ãã€ã«ãããŸãã
D.æ©èœçã€ã³ã¿ãŒãã§ãŒã¹ã§ã¯ãããŸããïŒ
æ£è§£ã¯Aã§ããããºã«ã¯ã»ãšãã©ãããŸããã ããããäžåœè£œã®æ©èœçãªã€ã³ã¿ãŒãã§ãŒã¹ãäœããŸãããã
@FunctionalInterface public interface CopyCatPredicate { <T> boolean test(T t); } CopyCatPredicate lambda = (Object obj) -> "adadas".equals(obj); CopyCatPredicate methodRef = "adadas"::equals;
åã®ã³ãŒããšã®éãã¯äœã§ããïŒ ã¢ããã«å ããŠãã€ã³ã¿ãŒãã§ã€ã¹èªäœããã¡ãœããã«ãžã§ããªãã¯ã転éãããžã§ããªãã¯ã¯ã©ã¹ã§ã¯ãªããžã§ããªãã¯ã¡ãœãããååŸããŸããã ãžã§ããªãã¯ã¡ãœããã䜿çšããŠæ©èœçãªã€ã³ã¿ãŒãã§ã€ã¹ãäœæã§ããŸããïŒ
A.äž¡æ¹ãã³ã³ãã€ã«ãããŸã
B. Lambdaã³ã³ãã€ã«ãã¡ãœãããªãã¡ã¬ã³ã¹-ããã
C.ã¡ãœããåç
§ã¯ã³ã³ãã€ã«ãããŸãããã©ã ãã¯ã³ã³ãã€ã«ãããŸãã
D.æ©èœçã€ã³ã¿ãŒãã§ãŒã¹ã§ã¯ãããŸããïŒ
æ£è§£ã¯Sã§ããã¡ãœããã®æ¹ãåªããŠãããšèŠåãããŸããã Lambdaã¯ãžã§ããªãã¯ã¡ãœãããå®è£
ã§ããŸããã Lambdaã§ã¯ããã©ã¡ãŒã¿ãŒãæž¡ããããã«åãæå®ããå¿
èŠããããŸãã 衚瀺ããªãå Žåã§ããäœããã®æ¹æ³ã§è¡šç€ºããå¿
èŠããããŸããã衚瀺ããã«ã¯ããžã§ããªãã¯å€æ°ãå¿
èŠã§ãã ã€ãŸããããã§ã¯æ±çšã®ã©ã ããäœæããå¿
èŠããããŸããå±±æ¬åŒ§å
ã®ã©ããã«Tãæžã蟌ããTãæžã蟌ãŸãªãã§ãã ããïŒå¥ã®æåã䜿çšã§ããŸãïŒã ãããããã®ãããªæ§æã¯ãããŸããã圌ãã¯ãããæãä»ãããããããã倧äžå€«ã§ãããã©ã ãã§ã¯æ©èœããªããšæ±ºããŸããã
@FunctionalInterface public interface CopyCatPredicate { <T> boolean test(T t); } CopyCatPredicate lambda = (Object obj) -> "adadas".equals(obj);
ãŸããã¡ãœããåç
§ã䜿çšããã°ããã¹ãŠåé¡ãããŸããããã®ãããªåé¡ã¯ãããŸããã ãããã£ãŠãäœããããŸããããªãå Žåã¯ãããã¥ã¡ã³ãã远å ããå¿
èŠããããŸãã

Javaããºã«çªå·9ïŒåå ããäŒè°ã¯ïŒ
äŒè°ã«è¡ããããå€ãã®äŒè°ããããŸãã ãããããã£ã«ã¿ãªã³ã°ãããããã
TreeSet
ã«å
¥ããããã«å¿ããŠçµæãå°å·ããŸãã
List<String> list = Stream.of("Joker", "DotNext", "HolyJS", "HolyJS", "DotNext", "Joker").sequential() .filter(new TreeSet<>()::add).collect(Collectors.toList()); System.out.println(list);
ããªãã¯äœãåŸãŸããïŒ
A.ãœãŒãããã³ãã£ã«ã¿ãŒåŠç[DotNextãHolyJSãJoker]
B.åœåã®å
容[JokerãDotNextãHolyJSãHolyJSãDotNextãJoker]
C.åæã ããã£ã«ã¿ãŒæžã¿[JokerãDotNextãHolyJS]
D.ãœãŒããããŠããããã£ã«ã¿ãªã³ã°ãããŠããªã[DotNextãDotNextãHolyJSãHolyJSãJokerãJoker]
æ£è§£ã¯Cã§ããããã¯
reference
ã¡ãœããã§ããã1ã€ã®
TreeSet
ãããããããã£ã«ã¿ãªã³ã°ã¯æ©èœããŸãã åå¿è
ã¯ã
reference
ã¡ãœãããšLambdaã¡ãœããã¯ã»ãšãã©åããã®ã ãšæããŸããããŸã£ããåããã®ã§ã¯ãããŸããã Lambdaã
TreeSet
ãå Žåãæ°ãã
TreeSet
ãæ¯åäœæãããŸããããã¯åç
§ã¡ãœããã§ããããããã®ãã£ã«ã¿ãªã³ã°ããã¹ãŠè¡ãåã«äžåºŠäœæãããåç
§ã¡ãœãããã¢ã¿ãããããŸãã çµæãšããŠTreeSetã«ãããã®ã䜿çšããªããããäœããœãŒããããŸãããtrueãŸãã¯falseã®ãããããè¿ããã£ã«ã¿ãŒãšããŠ
add
ã¡ãœããã䜿çšããã ãã§ãïŒéè€ãç Žæ£ããå¿
èŠããããã©ããïŒã å®éãããªãã¯ãŸã£ããå¥åã«æžãããšãã§ããããã¯åãã§ãã ãã®åŸããã®ããªã»ããã®çµæã¯
GarbageCollector
ãäœãããã«ãããã¯èª°ã«ãããããŸããã

çµè«
Javaã®æ§èœã¯åäžããŠãããè¶³ãèžã¿å
¥ããæ¹æ³ãå¢ããŠããŸãã ãããã£ãŠãããã«ããã€ãã®ãã³ãããããŸãã
- èªã¿åãå¯èœãªã³ãŒããèšè¿°ããŸãã
- æµæã§ããªãå Žåã¯ããã¹ãŠã®ããªãã¯ã«ã³ã¡ã³ãããŠãã ããã
- Javaã§ãããããªããæ··ä¹±ããããã°ããããŸãã
- éçã³ãŒãã¢ãã©ã€ã¶ãŒã«ãŒã«ïŒ IntelliJ IDEAã䜿çšããŸãã
- ãã¹ãŠã®ãã°ã¯ããã¥ã¡ã³ãã«è¡ã远å ããããšã§ä¿®æ£ããããããããã¥ã¡ã³ããç¥ãå¿
èŠããããŸãã
- stråãååŸããªãã§ãã ããã ã¡ãªã¿ã«ãææ°ã®IDEAã§ã¯ãç²ããŠããå Žåã¯ã¹ããªãŒã ããµã€ã¯ã«ã«å€ããããšãã§ããŸãã
ããºã«ã«åºããããå Žåã¯ãpuzzlers @ jfrog.comã«éä¿¡ããŠãã ãããæ¬¡ã®ã«ã³ãã¡ã¬ã³ã¹ã®ããããã§3ã·ãŒãºã³ç®ãéããããšãã§ããŸãã 貎éãªã³ããŒãšåŒãæãã«ããã©ã³ãTã·ã£ãããéãããŸãã
ç§ãã¡ãšåãããã«Javaéçºã®ãã¹ãŠã®è©³çŽ°ãæ¥œãã¿ããå Žåã¯ããããã4æã®
JPoint 2018ã«ã³ãã¡ã¬ã³ã¹ã§ãããã®ã¬ããŒãã«èå³ãããã§ãããã