Используя array.map, мы можем уменьшить цикл, см. это в jsfiddle
function Check(){
var arr = Array.prototype.slice.call(arguments);
var result = [];
for(i=0; i< arr.length; i++){
var duplicate = 0;
var val = arr[i];
arr.map(function(x){
if(val === x) duplicate++;
})
result.push(duplicate>= 2);
}
return result;
}
To Test:
var test = new Check(1,2,1,4,1);
console.log(test);
Поскольку за последние 10 лет мир продвинулся вперед, и язык Java (! = JVM) с трудом поспевает за ним. Более современные языки для JVM основаны на новых идеях и улучшенных концепциях, что делает многие утомительные задачи намного более простыми и безопасными.
Не будучи экспертом по Clojure, я бы сказал, что главное преимущество в том, что Clojure скрывает многие детали параллельного программирования, и, как мы все знаем, дьявол кроется в деталях, поэтому я считаю, что это хорошо.
Вы можете проверить эту отличную презентацию Рика Хики (создателя Clojure) о параллелизме в Clojure. РЕДАКТИРОВАТЬ: Очевидно, JAOO удалил старые презентации. Мне пока не удалось найти для этого новый источник.
Clojure разработан для параллелизма .
Clojure предоставляет примитивы параллелизма на более высоком уровне абстракции, чем Java. Вот некоторые из них:
Программная система транзакционной памяти для работы с синхронными и скоординированными изменениями общих ссылок. Вы можете изменить несколько ссылок как атомарную операцию, и вам не нужно беспокоиться о том, что делают другие потоки в вашей программе. В рамках вашей транзакции у вас всегда будет единый взгляд на мир.
Агентская система для асинхронного изменения. Это похоже на передачу сообщений в Erlang.
Поток локальных изменений переменных. Эти переменные имеют корневую привязку, которая используется всеми потоками вашей программы. Однако, когда вы повторно связываете переменную, она будет видна только в этом потоке.
Все эти примитивы параллелизма построены на основе неизменяемых структур данных Clojures (то есть списков, карт, векторов и т. д.). Когда вы входите в мир изменяемых объектов Java, все примитивы ломаются, и вы возвращаетесь к блокировкам и условным переменным (которые также можно использовать в clojure, когда это необходимо).
Развитие языка программирования Java идет довольно медленно, главным образом из-за озабоченности Sun по поводу обратной совместимости.
Почему бы вам не просто напрямую использовать языки JVM, такие как Clojure и Scala?
Поскольку Clojure основан на парадигме функционального программирования , то есть обеспечивает безопасность параллелизма, следуя нескольким простым правилам:
Написанные таким образом программы в значительной степени имеют встроенную горизонтальную масштабируемость, тогда как механизм параллелизма на основе блокировки (как в Java) подвержен ошибкам, связанным с условиями гонки, взаимоблокировками и т. Д. .
В дополнение к подходу Clojure к параллелизму через неизменяемые данные, переменные, ссылки (и программную транзакционную память), атомы и агенты ... стоит изучить Лисп. Вы получаете макросы Lisp, деструктурирование, функции и замыкания первого класса, REPL и динамическую типизацию - плюс литералы для списков, векторов, карт и наборов - все в дополнение к взаимодействию с библиотеками Java (а также разрабатывается версия CLR. )
Это не совсем то же самое, что Scheme или Common Lisp, но изучение его поможет вам, если вы когда-нибудь захотите изучить Структура и интерпретация компьютерных программ или понять, о чем говорит Пол Грэм в своей эссе , и вы можете отнести этот комикс от XKCD. ; -)
Да, Java предоставляет все необходимые возможности для параллельных программ.
Аналогия: C предоставляет все необходимые возможности для программ, безопасных для памяти, даже с большим количеством обработки строк. Но в языке C безопасность памяти - это проблема программистов.
Как это бывает, анализировать параллелизм довольно сложно. Лучше использовать изначально безопасные механизмы, чем пытаться предвидеть все возможные опасности параллелизма.
Если вы пытаетесь обезопасить параллельную программу с изменяемой структурой данных с разделяемой памятью, добавляя блокировки, вы идете по канату. Кроме того, это в значительной степени непроверяемое.
Хорошим компромиссом может быть написание параллельного кода Java с использованием функционального стиля Clojure.
Одна из замечательных особенностей неизменяемых типов заключается в том, что большинство встроенных функций уже являются многопоточными. Простое «сокращение» будет охватывать несколько ядер / процессоров без какой-либо дополнительной работы с вашей стороны.
Итак, вы можете быть многопоточным с Java, но это включает в себя блокировки и все такое. Clojure является многопоточным без каких-либо дополнительных усилий.
Эта видеопрезентация представляет собой очень убедительный аргумент, сосредоточенный вокруг эффективных постоянных структур данных, реализованных как попытки.