Lambdas
Эгерде сиз ламбда деген эмне экенин такыр билбесеңиз, анда: Ламбда төмөнкүдөй көрүнөт:(a, b) -> a.compareTo(b)
(переменные) -> действие
Азырынча ошол жетиштүү. Теорияны бул жерден окуй аласыз: биринчи шилтеме , экинчи шилтеме , бирок менимче практика алда канча кызыктуу. Мен сизге төмөнкү маселени чечүүнү сунуштайм: 1-ыкманы колдонуп калькулятор жазыңыз. Метод 2 санариптик баалуулуктарды жана башка нерсени кабыл алышы керек. Сиздин code төмөнкүдөй көрүнөт:
class Lambda{
public static void main (String[] args) {
}
public static double calculate(){
return null;
}
}
Метод кол тамгасына 3 параметрди киргизип calculate
, 1 буйрукту кошуп return
, бул ыкманы сынап көрүңүз main
. Бул ыкма эмне кылууга жөндөмдүү болушу керек?
- бүктөлүү;
- көбөйтүү;
- бөлүү;
- алып салуу;
- тамырын эсептөө;
- күчкө көтөрүү;
- аргументтердин суммасын биринчи санга + 117ге бөлүү;
- жана сиз ойлогон башка бардык операциялар.
if-else
;char
операциялык көрсөткүч катары;switch-case
;- жана сиздин оюңузга келген башкалардын бардыгы.
- Жалаң гана лямбдалар, милдет аларда.
inputStream
жана андай эмес OutputStream
. Бул башкача, кызыктуураак. Агымдар циклдерди толугу менен алмаштырды, бирок баары бир. Аларга «кандай кылууну түшүндүрбө, эмне кылуу керектигин түшүндүр» деген ураан менен кызмат кылышат. Агымдын кичинекей мисалы:
List<String> myList = Arrays.asList("a1", "a2", "b1", "c2", "c1");
myList.stream()
.filter(s -> s.startsWith("c"))
.map(String::toUpperCase)
.sorted()
.forEach(System.out::println);
Бул жерде эмне болуп жатат? Комментарийлерди кошолу:
myList.stream() // получить поток
.filter(s -> s.startsWith("c")) //отфильтровать значения, оставить те, что начинаются с «с»
.map(String::toUpperCase) // преобразовать все значения, перевести в верхний регистр
.sorted() // отсортировать по порядку (дефолтный порядо)
.forEach(System.out::println); // вывести каждый элемент на экран
Кадимки цикл менен салыштырыңыз:
List<String> toSort = new ArrayList<>();
for(String s : myList){
if(s.startsWith("c")){
toSort.add(s.toUpperCase());
}
}
Collections.sort(toSort);
for(String s : toSort){
System.ouy.println(s);
}
Кодду окуганда баары коркунучтуу көрүнөт, бирок комментарийлер менен оңойбу? Бул нормалдуу көрүнүш, мен да көпкө чейин түшүнгөн жокмун. Түшүнүүнүн ачкычы - бул практика. Ошондуктан, биз үчүнчү жактын макалаларын окуп, суроолорубузга жооп издей баштайбыз, аларды бул жерден комментарийлерде сурасаңыз болот, мен толук жооп бербейм, бирок мен багытты көрсөтөм. JavaRush тапшырмаларынын тизмеси, менимче, агымды көнүгүү үчүн эң сонун деп ойлойм:
-
2208 - 1 агым жана 1 кайтаруу менен чечorши мүмкүн, б.а. методдун денеси менен башталат
return
жана андан кийин 1 бүтүндөй агым болот. Келгиле, талапты жокко чыгаралыStringBuilder
. -
1908 - 1 агым жана 1 кайтаруу менен да чече аласыз. Файлды окуу менен башталат. Мен агым аркылуу файлга кантип жаздырууну билбейм (эгерде бул мүмкүн болсо), биз аны кол менен жасайбыз. Ошол. Биз болгону 2 агымды ачабыз (консоль жана файлга жазуу). Биз файлды бизге барак же агым (google жана javadoc) кайтара турган ыкмалар аркылуу окуйбуз.
-
1907 - теория боюнча, ошондой эле бир агым менен чечorши мүмкүн. Агымга киргизүү файлдын аталышы, чыгаруу - дүйнөдөгү сөздөрдүн саны.
-
1016 - бир аз бурмаланган жол менен, аны 1 агым жана 1 кайтаруу менен чече аласыз;
-
1821 - абдан жеңил жана 1 агым жана 1 кайтып.
Бул 2 тапшырма сизди башка агым ыкмасы жана башка коллекционер менен тааныштырат.
-
1925 - бир агымда сөздөрү бар сапты алып, анан аны файлга жаза аласыз (агымдан файлга жазуу мүмкүнбү, жокпу билбейм)
GO TO FULL VERSION