Больше отличных статей.
«Микросервисы — это не все, а лишь подмножество определенного домена».
С таким количеством компонентов мониторинга всегда найдется подходящий для вас
«С Нетти, что мы разрабатываем? 》
«Вероятно, это наиболее подходящая спецификация Redis».
«Портрет программиста, десять лет взлетов и падений»
Самая полезная серия:
«Наиболее часто используемый набор навыков «vim» в производственной среде Linux.
«Наиболее часто используемый набор навыков «Sed» в производственной среде Linux.
«Наиболее часто используемый набор навыков «AWK» в производственной среде Linux.
Недавно нанял интересного молодого коллегу и много занимался кодом. Я открыл git-запись и увидел, что ее много использовали.java8
особенности синтаксиса, рефакторинг кода. Наиболее часто используетсяmap
,flatMap
какой-то тип.
Но другие друзья не хотят.Хотя некоторые люди считают, что код стал более понятным, больше людей считают, что код стал очень неясным.Это как: снимай штаны и пукай, и ты лишний.
Объем этих функций, в зависимости от уровня, я думаю, можно разделить на три категории. Это буквально везде.
не злоупотребляйте
Я также не знаю, когда эти функции стали популярными, но они должны быть очень тесно связаны с функциональным программированием. Похоже, это началось со Scala в 2004 году.
Ничего волшебного, все они — синтаксический сахар, чтобы сделать ваши программы более лаконичными. Вы можете сделать это с небольшим количеством кода, если хотите. Не используйте его преднамеренно, чтобы продемонстрировать свое мастерство. Крайности будут обратными. Если вы не используете их должным образом, эффект будет очень негативным. Например, java, который не является функциональным языком программирования, тогдаlambda
Это просто помощь, и вы пишете ее на javaLisp
Код, он будет только невзрачный.
Но язык еще нужно интегрировать, потому что тренд такой. Вместо того, чтобы смотреть на дизайн, стоящий за ними, мы смотрим только на то, что они выражают горизонтально из семантического представления API.
Давайте сначала рассмотрим общие черты (примечание: логические общие черты, подходящие не для всех сценариев), а затем возьмем несколько типичных реализаций и посмотрим на выступления программистов на этой планете.
эти абстрактные понятия
Говорят, что объектом этих функций является нечто, называемое потоком. Тот流
Что это за вещь? Пожалуйста, простите меня за объяснение с некоторыми непрофессиональными словами.
Будь то на уровне языка или распределенной структуры данных, на самом деле это простой массив. Иногда это действительно простой массив, иногда это распределенный массив, существующий на нескольких машинах. Далее в совокупности мы ссылаемся на数组流
.
Мы просто делим их на две категории.
语言层面的:比如Java的Stream
分布式层面的:比如Spark的RDD
Все они имеют следующие важные моменты.
Функции могут использоваться в качестве параметров
Язык C, конечно, не проблема, вы можете передавать функции как указатели. Но не так давно в Java это приходилось реализовывать окольным путем (используя класс в концепции java для имитации функций, вы увидите много странных java-классов, таких как Func1 и Func0).
Функции как параметры — необходимое условие для того, чтобы сделать код кратким. Большинство наших обычных методов программирования заключаются в последовательном выполнении некоторых операций.
array = new Array()
array = func1(array)
if(func2(array)){
array = func3(array)
}
array = func4(array)
И если функцию можно использовать в качестве параметра, я могу попытаться максимально разбить операцию на плитки. В конце концов, его еще нужно перевести в приведенный выше оператор для выполнения.
array = new Array()
array.stream()
.map(func1)
.filter(func2)
.flatMap(func3)
.sorted(func4)
...
Парадигма программирования полностью изменилась, и у функций появилась семантика.
sequential & parallel
если наш数组流
Если он слишком велик для одной машины, есть два способа последовательной обработки и параллельной обработки.
Обычно это можно сделать поparallel
Функция переходит в режим параллельной обработки. Для большинства локальных операций включение параллельного режима не обязательно быстрее.
Набор ForkJoin, используемый в java, скорость потока, знаете ли...
Для распределенных потоков данных, которые по своей сути параллельны, этот параметр не имеет большого значения.
Вид функции
Функции, которые обычно воздействуют на потоки данных, делятся на две категории.
转换。Transformation
动作。Action
преобразование, которое обычно характеризуетсяlazy
.
Толькоaction
Когда он будет выполнен, он будет фактически участвовать в операции. Таким образом, вы можете думать об этих переходах как о наборе буферизованных операций. Типичные функции: карта, плоская карта и т. д. Они нанизаны, как вертел, и ждут, когда их разобьют.
действие. Настоящий триггерный код, описанный выше, также хлынет потоком, открывшим ворота. типичный какreduce
функция, вот и все.
Приведенное выше описание не обязательно совпадает, например, карта Python может выводить результат после выполнения. Это очень неловко.
map & reduce
Когда дело доходит до сопоставления и редукции, все неизменно думают о хаупе. Однако это не просто концепция больших данных.
Для понятия о них мы вводим только следующие две строки.
map
Примените переданную функцию к каждому элементу последовательности по очереди и используйте результат как новыйпоток массивавозвращение.
reduce
сокращение похоже на рекурсивную концепцию. в конечном итоге сведется к одному значению. Проверьте эту формулу :)
reduce([p1,p2,p3,p4],fn) = reduce([fn(p2,p4),fn(p1,p3)])
Подробнее см. в классической статье Google.
«MapReduce: упрощенная обработка данных на больших кластерах»Love.Google/research/Public…
Вы можете посетить? :)
map & flatMap
Эти две функции часто используются. Они имеют следующие отличия:
map
Пучок数组流
Для каждого значения в , используйте предоставленную функцию, чтобы выполнить его один раз, однозначное соответствие. получить одинаковое количество элементов数组流
.
flatMap
плоский значит плоский. это ставит数组流
Для каждого значения в , используйте предоставленную функцию, чтобы выполнить его один раз, однозначное соответствие. получить тот же элемент数组流
. Однако элемент внутри также является дочерним数组流
. После объединения этих подмассивов в один массив количество элементов, скорее всего, будет таким же, как и исходное.数组流
разных чисел.
Производительность программистов
Java8 виды потока
Начиная с java8, была добавлена новая абстракция, называемая потоком: Stream. Благодаря лямбда-синтаксису код можно сделать особенно свежим и чистым.Scala
).
Очень хорошее руководство:стек ifengyun.com/streams-expensive…
Операции Spark RDD
Базовой моделью данных Spark является RDD, представляющая собой ориентированный ациклический граф. Он представляет собой неизменяемую разделяемую коллекцию, элементы которой можно вычислять параллельно.
Он распространяется, но мы можем посмотреть на следующийWordCount
пример.
JavaRDD<String> textFile = sc.textFile("hdfs://...");
JavaPairRDD<String, Integer> counts = textFile
.flatMap(s -> Arrays.asList(s.split(" ")).iterator())
.mapToPair(word -> new Tuple2<>(word, 1))
.reduceByKey((a, b) -> a + b);
counts.saveAsTextFile("hdfs://...");
Какой знакомый API, вы наверняка видели его в Hadoop.
DataStream Флинка
Программы Flink — это обычные программы, которые выполняют преобразование распределенных коллекций (например, фильтрацию, сопоставление, обновление состояния, объединение, группировку, определение окон, агрегирование). Программа DataStream во Flink представляет собой преобразование, реализованное в потоке данных.
Давайте также посмотрим на кусок кода для него.
DataStream<Tuple2<String, Integer>> counts =
// split up the lines in pairs (2-tuples) containing: (word,1)
text.flatMap(new Tokenizer())
// group by the tuple field "0" and sum up tuple field "1"
.keyBy(0).sum(1);
Работа потока кафки
Kafka стала платформой распределенных потоковых вычислений. он абстрагируетKStream
иKTable
, который похож на RDD Spark и имеет аналогичные операции.
KStream можно рассматривать как журнал изменений (changlog) KTable, и каждая запись в потоке данных соответствует каждому обновлению в базе данных.
Давайте посмотрим на кусок кода для него.
KTable<String, Long> wordCounts = textLines
.flatMapValues(value -> Arrays.asList(value.toLowerCase().split("\\W+")))
.groupBy((key, value) -> value)
.count();
wordCounts.toStream().to("streams-wordcount-output", Produced.with(stringSerde, longSerde));
RxJava
RxJava — это асинхронный фреймворк задач, основанный на шаблоне наблюдателя, который часто используется в разработке под Android (используется все больше и больше серверов).
RxJava внесла некоторые новшества на уровне языка, и у нее есть преданные сторонники.
лямбды на уровне языка
Да конечноHaskell
У этого естественного функционального языка программирования есть свой ореол. Но некоторые другие языки, в том числе языки сценариев, компилируемые языки, также впитали в себя этот опыт.
Все вместе они называются лямбдами.
Python
Как самый популярный язык сценариев, Python также имеет свой лямбда-синтаксис. Также существуют самые основные функции карты, уменьшения, фильтрации и другие функции.
JavaScript
js не может быть снесен, напримерArray.prototype.*()
Ждать. Оно должно быть, и оно есть.
End
Их гораздо больше, поэтому я не буду перечислять их по одному. Другими словами, являются ли эти функции патентоспособными? Мне нравится, хоть и редко пользуюсь.